为什么这个小C2B;+程序无法使用 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++?
The following code will not compile with G++ 4.5 or 4.6 (snapshot). It will compile with the 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;
}
The error message is:
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<'
Is the program valid C++?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
由于
a.bar
中的bar
是一个依赖名称,编译器不知道它是一个模板。您需要指定这一点,否则编译器会将后续<…>
解释为二进制比较运算符:编译器行为正确。
这种行为的原因在于专业化。想象一下,您已将
Foo
类专门化为某个值:现在您的原始代码可以编译,但它意味着完全不同的东西。在第一个解析过程中,编译器尚不知道您在此处使用的是
Foo
的哪种特化,因此它需要消除a.bar
的两种可能用法之间的歧义;因此关键字template
向编译器表明后续的<...>
是模板参数。Since the
bar
ina.bar
is a dependent name, the compiler doesn’t know that it’s a template. You need to specify this, otherwise the compiler interprets the subsequent<…>
as binary comparison operators:The compiler behaves correctly.
The reason for this behaviour lies in specialisation. Imagine that you have specialised the
Foo
class for some value:Now your original code would compile, but it would mean something completely different. In the first parsing pass, the compiler doesn’t yet know which specialisation of
Foo
you’re using here so it needs to disambiguate between the two possible usages ofa.bar
; hence the keywordtemplate
to show the compiler that the subsequent<…>
are template arguments.