代码之家  ›  专栏  ›  技术社区  ›  miked

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

  •  5
  • miked  · 技术社区  · 16 年前

    我很难在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中,我得到错误:

    错误:标记“>”之前需要主表达式

    错误:标记')'之前需要主表达式

    对于case语句中的每一行。

    有什么想法吗?

    谢谢, 迈克

    2 回复  |  直到 16 年前
        1
  •  13
  •   Stack Overflow is garbage    16 年前

    问题是当编译器遇到 Op.Execute<char>(); 试图分析它,它会变得混乱。

    Op 是一个依赖名称,因此编译器对其成员不太了解。所以它不知道 Execute 是模板函数。相反,它假定 < 表示小于。 你试图比较一些未知的 执行 其他成员。

    因此,行应该如下所示:

    case 1: return Op.template Execute<char>();
    

    现在编译器知道了 执行 是一个模板,因此当它遇到 < 它不是“小于”,而是模板参数的开头。

    问题与你需要的相似 typename 当指定属于从属名称的类型时。当您引用模板成员函数,并且模板参数是显式给定的时,您需要 template 关键字。

    GCC的行为是正确的,MSVC过于宽容。如果添加 模板 关键字,您的代码将在两个编译器中工作(并且根据标准是正确的)

        2
  •  1
  •   moonshadow    16 年前
     case 1: return Op.template Execute<char>();
     case 2: return Op.template Execute<int>();
    

    见: template as qualifier

    另外,typeswitch()返回bool