我在使用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);
Run Code Online (Sandbox Code Playgroud)
在Windows中,这段代码完美无缺,完全符合我的要求.在Linux中,我得到错误:
错误:在'>'标记之前预期的primary-expression
错误:')'令牌之前的预期primary-expression
对于带有case语句的每一行.
有任何想法吗?
谢谢,迈克
jal*_*alf 13
问题是,当编译器遇到Op.Execute<char>();并尝试解析它时,它会变得混乱.
Op是一个从属名称,因此编译器对其成员了解不多.所以它不知道这Execute是一个模板功能.相反,它假定<手段小于.你试图将一些未知Execute成员与其他成员进行比较.
所以相反,该行应如下所示:
case 1: return Op.template Execute<char>();
Run Code Online (Sandbox Code Playgroud)
现在编译器知道这Execute是一个模板,所以遇到<它时不是"小于",而是模板参数的开头.
问题类似于typename指定属于从属名称的类型时的方式.当您引用模板成员函数,并且明确给出模板参数时,您需要template关键字.
海湾合作委员会的行为是正确的,MSVC太宽松了.如果添加template关键字,您的代码将在两个编译器中工作(并根据标准正确)