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

GCC 3.4.6中与模板函数相关的错误

  •  2
  • larsmoa  · 技术社区  · 16 年前

    我今天在办公室遇到了一个奇怪的编译错误,我怀疑这是我们的GCC版本(3.4.6)中的一个错误。我已经能够把它归结为几行代码(如下)。我得到的编译错误是:

    test.cpp:26: error: expected primary-expression before '>' token
    test.cpp:26: error: expected primary-expression before ')' token
    

    通过引入一个临时变量来存储第一条语句的结果,可以避免该错误( bar.value("yoyo")

    class Foo
    {
    public:
      template<typename T> bool doIt() const { return true; }
    };
    
    class Bar
    {
    public:
      Foo value(const char * key)
      {
        return Foo();
      }
    };
    
    template<typename T>
    void
    mytestfunc()
    {
       Bar bar;
       // Works fine:
       Foo foo = bar.value("yoyo");
       foo.doIt<T>();
    
       // Does not work on gcc 3.4.6:
       bar.value("yoyo").doIt<T>();
    }
    
    int main(int argc, char * args[])
    {
      return 0;
    }
    
    2 回复  |  直到 16 年前
        1
  •  4
  •   Stack Overflow is garbage    16 年前

    请尝试以下方法:

     bar.value("yoyo").template doIt<T>();
    

    就我所见,问题在于依赖名称,类似于有时需要在类型前面加前缀 typename .

    上面向编译器指定 doIt 使用“小于”运算符对其进行比较。

        2
  •  1
  •   A. L. Flanagan    16 年前

    编译器应该在最后一条语句中创建一个临时语句,其工作方式与前两条语句中的“foo”完全相同。所以是的,我认为这是一个bug,特别是因为它在GCC4中工作。另一方面,这是一些非常不寻常的代码,所以在实践中可能不会经常出现。一般来说,我发现3.4在模板方面非常可靠,特别是与一些专有编译器相比。