为什么这个小C ++程序不能用G ++编译?

时间:2011-05-04 10:43:01

标签: c++ templates gcc g++

以下代码无法使用G ++ 4.5或4.6(快照)进行编译。它将使用Digital Mars Compiler 8.42n进行编译。

template <int I>
struct Foo {
  template <int J>
  void bar(int x) {}
};

template <int I>
void test()
{
  Foo<I> a;
  a.bar<8>(9);
};

int main(int argc, char *argv[]) {
  test<0>();
  return 0;
}

错误消息是:

bugbody.cpp: In function 'void test() [with int I = 0]':
bugbody.cpp:16:11:   instantiated from here
bugbody.cpp:11:3: error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'

程序是否有效C ++?

1 个答案:

答案 0 :(得分:31)

由于bar中的a.bar依赖名称,因此编译器不知道它是模板。您需要指定此项,否则编译器会将后续<…>解释为二进制比较运算符:

a.template bar<8>(9);

编译器行为正确。

这种行为的原因在于专业化。想象一下,您已将Foo类专门用于某些值:

template <>
struct Foo<0> {
    int bar;
};

现在您的原始代码会编译,但这意味着完全不同的东西。在第一个解析过程中,编译器还不知道您在这里使用的Foo的哪个特化,所以它需要消除a.bar的两个可能用法之间的歧义;因此关键字template向编译器显示后续<…>是模板参数。