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

时间:2009-08-21 22:10:22

标签: 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);

在Windows中,这段代码完美无缺,完全符合我的要求。在Linux中,我得到错误:

错误:在'&gt;'之前预期的primary-expression令牌

错误:')'令牌

之前的预期主要表达式

对于带有case语句的每一行。

有什么想法吗?

谢谢, 麦克

2 个答案:

答案 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>();

请参阅:template as qualifier

此外,TypeSwitch()返回一个bool