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

时间:2010-01-06 13:19:13

标签: c++ templates gcc

我今天在办公室遇到了一个奇怪的编译错误,我怀疑它是我们的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"))的结果,可以避免错误。谁能告诉我是什么原因造成的?它是GCC 3.4.6中的错误(它似乎在GCC 4.x.x中有效)并且在此版本中是否存在其他类似的与模板相关的错误?

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 个答案:

答案 0 :(得分:4)

请改为尝试:

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

据我所知,问题在于依赖名称,类似于您有时需要使用typename为类型添加前缀。

上面向编译器指定doIt是模板成员方法,而不是使用'less than'运算符进行比较的成员变量doIt

答案 1 :(得分:1)

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