C++类外模板参数与类内模板参数
一般来说模板参数会声明在类的tag,以及类成员函数/非成员函数返回值之前;而修饰在类内部成员函数返回值的模板参数可以降低类实例构造,或调用过程中的声明复杂性,同时会导致编译问题。
关键字.template
C++模板编程在遇到类内模板函数声明及定义的情况下,容易导致的一类编译错误:
#include<iostream> #include<algorithm> #include<sstream> #include <iostream> using namespace std; template <typename U> class Object { public: Object(){}; virtual ~Object(){}; void _fun(const Object<U>& x) // 1 { std::cout << "Object::_fun no template arguments" << std::endl; } template <typename T> void fun(const Object<U>& x) // 2 { std::cout << "Object::fun internal" << std::endl; } template <typename T> void fun_(const Object<U>& x); // 3 }; template <typename U> template <typename T> void Object<U>::fun_(const Object<U>& x) // 3 { std::cout << "Object::fun_ external" << std::endl; }
为上述类提供一个interface及主函数:
1 template<class U, class T> 2 void test(Object<U>& obj) 3 { 4 obj._fun(obj); 5 obj.fun<T>(obj); 6 obj.fun_<T>(obj); 7 } 8 9 int main(){ 10 Object<char> Obj; 11 test<char,int>(Obj); 12 return 0; 13 }
编译报错 error: expected primary-expression before '>' token,分别在line5, line6,对应的成员函数分别是2, 3:
相对于无类内模板参数的成员函数1,原因是在调用模板函数时,g++无法分辨>是一个模板参数的起始符号还是一个比较操作符(大于或小于);所以需要使用关键字告诉g++这是一个模板参数的起始符号。
更新interface:
1 template<class U, class T> 2 void test(Object<U>& obj) 3 { 4 obj._fun(obj); 5 obj.template fun<T>(obj); 6 obj.template fun_<T>(obj); 7 }
可以编译通过:
标签:obj,template,void,Object,C++,类内,fun,模板 From: https://www.cnblogs.com/Desh/p/16945773.html