[转]gcc中使用模板类的类的编译错误
2009-02-27 13:53
260 查看
原文:http://blog.csdn.net/manesking/archive/2008/10/29/3173632.aspx
撰写时间:2008年03月12日
发布时间:2008年10月29日
整理时间:2008年10月29日
最近在自己写的一段代码中,使用了模板类的类,即如下形式:
template<class A>
void func(A)
{
fun2(A::B());
}
即A是一个模板类型,同时使用了A域下的类型B,需要根据A的不同而构造相应的B的实体,进行传递。
此种写法在VC6 + IntelC++9.0环境中能够通过编译,且程序行为与我想要的一致,(后来认为,估计Intel的编译器比较智能,或过于智能)。
但在cygwin + gcc3.4.4中却不能通过编译,其错误信息为:
instantiated from here
error: dependent-name `A::B' is parsed as a non-type, but instantiation yields a type
note: say `typename A::B' if a type is meant
其大致意思为:“编译器解析A::B不是个类型,但却要被初始化为一个类型。”
但是A::B确实是一个类型,这是基于我们通常使用类或名字空间下的子类的惯用语法,考虑可能是gcc对模板类的这种情况考虑不周,因而没能解析出这种用法。
随后又将该错误信息在百度里搜了一下,结果得到了正确的答案:
原来标准c++要求显示地声明一个类型是模板类型,诸如此类的如list<T>::iterater(当T是模板类型时),
包括vector,map都会有这样的问题,理由是具体类型的空间域名也是个“不确定”类型,所以要求有显示地typename声明,指示它是个模板类型
或名字。
其实gcc足够“聪明”,在错误信息里它已经提示你(最后一句话):“使用typename关键字声明,如果它是一个类型的含义”。只是我当时没有仔细看懂,呵呵。
如此修改即可:
template<class A>
void func(A)
{
fun2(typename A::B()); //在前面加typename即可,这里不接受”class”
}
此外,从这一点上,可以看到typename关键字在模板编程中有其独特的用法,而并不是与最初的理解那样,是个可以与class混用,可有可无的东西,建议将template<class A>语法中的class都替换为typename,可能会更规范些。
撰写时间:2008年03月12日
发布时间:2008年10月29日
整理时间:2008年10月29日
最近在自己写的一段代码中,使用了模板类的类,即如下形式:
template<class A>
void func(A)
{
fun2(A::B());
}
即A是一个模板类型,同时使用了A域下的类型B,需要根据A的不同而构造相应的B的实体,进行传递。
此种写法在VC6 + IntelC++9.0环境中能够通过编译,且程序行为与我想要的一致,(后来认为,估计Intel的编译器比较智能,或过于智能)。
但在cygwin + gcc3.4.4中却不能通过编译,其错误信息为:
instantiated from here
error: dependent-name `A::B' is parsed as a non-type, but instantiation yields a type
note: say `typename A::B' if a type is meant
其大致意思为:“编译器解析A::B不是个类型,但却要被初始化为一个类型。”
但是A::B确实是一个类型,这是基于我们通常使用类或名字空间下的子类的惯用语法,考虑可能是gcc对模板类的这种情况考虑不周,因而没能解析出这种用法。
随后又将该错误信息在百度里搜了一下,结果得到了正确的答案:
原来标准c++要求显示地声明一个类型是模板类型,诸如此类的如list<T>::iterater(当T是模板类型时),
包括vector,map都会有这样的问题,理由是具体类型的空间域名也是个“不确定”类型,所以要求有显示地typename声明,指示它是个模板类型
或名字。
其实gcc足够“聪明”,在错误信息里它已经提示你(最后一句话):“使用typename关键字声明,如果它是一个类型的含义”。只是我当时没有仔细看懂,呵呵。
如此修改即可:
template<class A>
void func(A)
{
fun2(typename A::B()); //在前面加typename即可,这里不接受”class”
}
此外,从这一点上,可以看到typename关键字在模板编程中有其独特的用法,而并不是与最初的理解那样,是个可以与class混用,可有可无的东西,建议将template<class A>语法中的class都替换为typename,可能会更规范些。
相关文章推荐
- gcc中使用模板类的类的编译错误
- 使用包含编译模型编译模板类时出现无法理解的错误
- 使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误
- Linux系统平台下关于GCC编译及使用的方法 (-Werror,它要求GCC将所有的警告当成错误进行处理
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- fedora 20下使用gcc 4.8.2编译gcc-4.4.1的错误
- C++中模板类使用友元模板函数 和友员非模版函数!使用不当出现编译错误:无法解析的外部符号…
- 使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- 使用gcc编译时错误提示: ld returned 1 exit status问题
- win32下使用gcc编译供java 调用的dll须知(jni) http://www.blogjava.net/lixf/archive/2005/12/23/25177.html
- linux编译android时报gcc和g++错误问题 [gcc]: unknown (64-bit) [FAIL]
- android源码使用proguard混淆编译及错误总结
- archlinux 下 vmware player 需要使用 gcc 5.1.0 编译的处理
- 怎么解决windows下使用eclipse和python编译时候 "Non-ASCII character"错误问题
- GCC中使用预编译头文件
- gcc版本不同导致的编译错误?
- GCC使用技巧之预编译
- AVRGCC/WinAVR编译环境中断函数的使用方法