关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
来源:互联网 发布:最优化求解 编辑:程序博客网 时间:2024/04/28 04:29
今天写STL中 rb_tree 的时候意外的发现一个问题:模板类的模板成员函数不能在类定义外部进行特化,特化必须放在类定义内,否则将报错:error C2244: “X<Val>::test”: 无法将函数定义与现有的声明匹配
经过写如下的简单代码可以看出问题所在:(错误版本)
//定义模板类X。其中拥有模板成员 testtemplate<class Val> class X{public:X(){}template<class Type>void test(Type);};//定义模板函数template<class Val>template<class Type>void X<Val>::test(Type x){cout << "in common " << endl;}//特化模板函数template<class Val>template<>void X<Val>::test(int x){cout << "in int " << endl;}
上述代码中,在编译时将报错,错误处在特化模板函数时,报错为无法将函数定义与现有声明匹配。若将特化模板函数的部分去掉,则程序正常编译。
若将模板成员函数的特化放置在类定义中,则将不会再报错。即:正确代码如下:
//定义模板类template<class Val>class X{public:X(){}template<class Type>void test(Type); //声明模板成员函数 //在模板类定义内部特化模板成员函数(正确编译)template<>void test(int x){cout << "in int " << endl;}};//在模板类外部定义模板成员函数(正确编译)template<class Val>template<class Type>void X<Val>::test(Type x){cout << "in common " << endl;}由此可以看出,报声明与定义不匹配的错误出错的原因是模板成员函数在类定义外部进行了特化。但是目前还不知道为什么这样的操作会不能通过编译。但同时需要注意,对于非模板类的模板成员函数,可以在类定义外部进行特化。
class X{public:template<class T>void test(T t); //非模板类中模板成员函数的声明};//模板成员函数的定义template<class T>void X::test(T t){cout << "in common" << endl;}//非模板成员函数中模板成员函数的特化(正常编译)template<>void X::test<int>(int x){cout << "in int" << endl;}
0 0
- 关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
- C++模板类的成员函数定义与声明必须在一个头文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类中friend函数的声明与定义
- 模板类定义与声明
- 模板类成员函数的定义和声明
- C++ 在.h文件中声明,在.cpp文件中定义 模板函数和模板类
- 函数模板和类模板成员函数的定义通常放在头文件中
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里
- c++模板类/模板函数的声明与定义应该放在头文件里,不要分开来写类中函数的声明与定义
- 特化类模板成员
- 特化类模板成员
- Android开发面试经——3.常见Java基础笔试题
- Windows Server 2008 R2 由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。
- ubuntu下安装flash
- Torch7平台上显示图片的几种方法
- 17.Remove Duplicates from Sorted List
- 关于模板类中模板成员函数在类定义外部特化报错,错为声明与定义不匹配
- Handler任务模型之Looper类分析
- 开通了
- 【Unity】UGUI怎么动态的添加按钮的OnClick点击事件
- extjs4.2 隐藏treePanel 的节点
- Jsoup解析HTML实例及文档方法详解
- hdu 1596 floyd算法 find the safest road
- 2.6 特殊的矩阵和向量
- 浅述JAVA Socket的简单实例实现