以下代码无法使用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 ++?
答案 0 :(得分:31)
由于bar
中的a.bar
是依赖名称,因此编译器不知道它是模板。您需要指定此项,否则编译器会将后续<…>
解释为二进制比较运算符:
a.template bar<8>(9);
编译器行为正确。
这种行为的原因在于专业化。想象一下,您已将Foo
类专门用于某些值:
template <>
struct Foo<0> {
int bar;
};
现在您的原始代码会编译,但这意味着完全不同的东西。在第一个解析过程中,编译器还不知道您在这里使用的Foo
的哪个特化,所以它需要消除a.bar
的两个可能用法之间的歧义;因此关键字template
向编译器显示后续<…>
是模板参数。