我在使用Linux编译代码时遇到了一些麻烦,但它在Windows中完美运行。
Windows编译器:Visual Studio 2005
Linux编译器:gcc版本3.4.3 20041212(Red Hat 3.4.3-9.EL4)
class DoSomething
{
public:
template <class DataType>
bool Execute()
{
//do something here
}
};
template <class Operator>
TypeSwitch(int DataTypeCode, Operator& Op)
{
switch (DataTypeCode)
{
case 1: return Op.Execute<char>();
case 2: return Op.Execute<int>();
//snip;
}
}
//To call the operator
TypeSwitch(Code,DoSomething);
在Windows中,这段代码完美无缺,完全符合我的要求。在Linux中,我得到错误:
错误:在'&gt;'之前预期的primary-expression令牌
错误:')'令牌
之前的预期主要表达式对于带有case语句的每一行。
有什么想法吗?
谢谢, 麦克
答案 0 :(得分:13)
问题在于,当编译器遇到Op.Execute<char>();
并尝试解析它时,会感到困惑。
Op
是一个依赖名称,因此编译器对其成员了解不多。所以它不知道Execute
是模板函数。相反,它假设<
意味着小于。
你试图将一些未知的Execute
成员与其他成员进行比较。
相反,该行应如下所示:
case 1: return Op.template Execute<char>();
现在编译器知道Execute
是一个模板,所以当它遇到<
时,它不是“小于”,而是模板参数的开头。
在指定属于从属名称的类型时,问题与您需要typename
的方式类似。当您引用模板成员函数并明确给出模板参数时,您需要template
关键字。
GCC的行为是正确的,MSVC太宽松了。如果您添加template
关键字,您的代码将在两个编译器中都有效(根据标准是正确的)
答案 1 :(得分:1)
case 1: return Op.template Execute<char>();
case 2: return Op.template Execute<int>();
此外,TypeSwitch()返回一个bool