这段代码可以在VS2013中正确运行,并输出:
你好,133
你好,233
,但在code :: blocks(使用GCC编译器和Ubuntu系统)中,编译器告诉我:
|| === Build:test_sth中的Debug(编译器:GNU GCC编译器)=== |
在成员函数'void A :: say()'中:
第28行错误:')'令牌之前的预期主要表达式
在'void A :: say()[with C = B]'的实例化中:
第31行要求从这里开始
第28行错误:类型'<的无效操作数未解决的重载函数类型>'和'int'到二元'运算符<'
|| ===构建失败:2个错误,2个警告(0分钟,0秒(s))=== |
有没有人可以告诉我什么是错的?为什么?
第28行是:this-> c.Match< 233>();
第31行是:模板结构A< B< int>取代;
JLayeredPane
答案 0 :(得分:1)
使用关键字模板作为限定符来区分成员模板与其他实体。以下示例说明何时必须使用模板作为限定符:
class A
{
public:
template<class T> T function_m() { };
};
template<class U> void function_n(U argument)
{
char object_x = argument.function_m<char>(); // ill-formed
}
在此示例中,变量object_x的定义不正确。编译器假定符号&lt;是一个不足的运营商。为了使编译器能够识别模板函数调用,必须添加模板限定符:
char object_x = argument.template function_m<char>();