跨平台代码中的c ++模板问题

mik*_*ked 5 c++ templates

我在使用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关键字,您的代码将在两个编译器中工作(并根据标准正确)

  • 欢迎来到C++模板解析规则的精彩,神奇的世界! (2认同)