我今天在办公室遇到了一个奇怪的编译错误,我怀疑它是我们的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;
}
答案 0 :(得分:4)
请改为尝试:
bar.value("yoyo").template doIt<T>();
据我所知,问题在于依赖名称,类似于您有时需要使用typename
为类型添加前缀。
上面向编译器指定doIt
是模板成员方法,而不是使用'less than'运算符进行比较的成员变量doIt
。
答案 1 :(得分:1)
编译器应该在最后一个语句中创建一个临时语句,它与前两个语句中的“foo”完全相同。所以是的,我认为这是一个错误,特别是因为它在GCC 4中工作。另一方面,这是一些非常不寻常的代码,所以它在实践中可能不会经常出现。一般来说,我发现3.4在模板方面非常可靠,特别是与一些专有编译器相比。