为什么这个小C&#x​​2B;+程序无法使用 G++ 编译?

发布于 2024-11-04 20:11:31 字数 631 浏览 0 评论 0原文

以下代码无法使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅忆 2024-11-11 20:11:31

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

a.template bar<8>(9);

编译器行为正确。

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

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

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

Since the bar in a.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:

a.template bar<8>(9);

The compiler behaves correctly.

The reason for this behaviour lies in specialisation. Imagine that you have specialised the Foo class for some value:

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

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 of a.bar; hence the keyword template to show the compiler that the subsequent <…> are template arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文