免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xiaoligang
打印 上一主题 下一主题

gcc4.1对模板实例化的支持有问题??问题已解决,感谢大家的回答,特别是 whyglinux [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-29 16:08 |只看该作者
使用函数之前必须要首先声明。你的程序没有做好这一点,也就是说程序中还有问题存在。

在旧版的 GCC 中编译通过而在新版的 GCC 中编译不通过,说明新版 GCC 对非法程序的检查更加彻底一些。

论坛徽章:
0
12 [报告]
发表于 2007-01-29 16:47 |只看该作者
原帖由 whyglinux 于 2007-1-29 16:08 发表
使用函数之前必须要首先声明。你的程序没有做好这一点,也就是说程序中还有问题存在。

在旧版的 GCC 中编译通过而在新版的 GCC 中编译不通过,说明新版 GCC 对非法程序的检查更加彻底一些。


并不是这个问题,对于模版库的设计者,
他不知道你会用什么样的类型去实例化模版函数,
也就是说要在模板定义的前面声名所有类型的函数调用是不可能。

就像我们要对自己的类型特化模板一样。对于自己定义的类,结构,设计者不可能会知道。


你可以想一想你在用stl中的模板的时候

是把对于你自己的定义的类的操作符号重载写到了,你所调用的模板定义的前面了吗?

比如 class test{...}; map<test> mapTest;


[ 本帖最后由 xiaoligang 于 2007-1-29 16:54 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2007-01-29 17:21 |只看该作者
>> 并不是这个问题,对于模版库的设计者,
>> 他不知道你会用什么样的类型去实例化模版函数,

是这样的。

>> 也就是说要在模板定义的前面声名所有类型的函数调用是不可能。

怎么不可能?模板是做什么用的?

>> 你可以想一想你在用stl中的模板的时候
>> 是把对于你自己的定义的类的操作符号重载写到了,你所调用的模板定义的前面了吗?
>> 比如 class test{...}; map<test> mapTest;

实在是没看明白你的意思。

论坛徽章:
0
14 [报告]
发表于 2007-01-29 17:27 |只看该作者
我在顶楼写了这么一段话。

请您参考

“对于认为 在模板定义中所有用到的函数都要要首先声明的请看

c++primer 第三版 10.9 模板定义中的名字解析

节的解释。”

论坛徽章:
0
15 [报告]
发表于 2007-01-29 23:46 |只看该作者
我在上面回答 xiaoligang 提出的这个问题的时候,其实还没有真正了解问题的实质,所以可忽略我上面的回答,请参见下面的回答:

对于依赖模板参数的函数的解析问题,在原来 C++ 98 标准的基础上根据下面的一个缺陷报告进行了一些修正。

197. Issues with two-stage lookup of dependent names

也就是说,在《C++ Primer 3》中的有关叙述对于模板参数是基本类型的情况已经过时了。

当传入模板函数的模板参数是一个基本类型(fundamental type)的时候,由于基本类型不具有关联名字空间和类域(associated namespaces and classes),所以没有额外的空间进行名字查找,只进行默认的名字查找(其搜索范围是在名字被使用之前),因此要求在使用之前要有函数的声明存在。

如果模板参数是非基本类型,比如是一个类类型,则除了默认的查找范围外,还可以查找这个类的类域以及这个类所在的名字空间等关联空间。所以,函数的声明无论是在类定义之前还是之后都处于名字搜索空间内都可以被找到。

根据上面的分析可知:楼主的程序是一个不正确的程序,因为 print(int) 将永远也不会被找到,当然也不会被调用。唯一能找到的函数声明是在使用 print 之前出现的 print(const char *)。显然,当函数模板参数类型和 const char * 不一致的时候一般会导致编译错误。

新版的 GCC 编译器遵循了这一新的 C++ 标准的规定,而旧版的没有,也就出现了两种不同的编译结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP