为什么这个私有模板函数能够编译? ->编译器错误 VS 2009

发布于 2024-11-03 19:17:53 字数 371 浏览 1 评论 0原文

这在 VS 2009 中编译没有问题吗?我是傻子吗? GCC 发出警告,该模板是私有的......? 我缺少什么?

#include <iostream>

using namespace std;

class A
{
private:
    template<typename T>
    A& operator<<(const T & v)
    {
        cout << v << endl;
        return *this;
    }
};

int main()
{
   A a;
   a << 4;
   system("pause");
}

This compiles with out problems in VS 2009? Am I stupid?
GCC gives a warning, that the template is private....?
What am I missing?

#include <iostream>

using namespace std;

class A
{
private:
    template<typename T>
    A& operator<<(const T & v)
    {
        cout << v << endl;
        return *this;
    }
};

int main()
{
   A a;
   a << 4;
   system("pause");
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(3

浅忆流年 2024-11-10 19:17:53

微软承认了这个错误,并声称它将在编译器的下一个主要版本中修复(我将其理解为 VC11/VS-whatever-is-after-2010 - 可能不是 VC10/VS2010 的服务包):

从评论来看,修复似乎已经针对内部编译器构建进行了。

Microsoft acknowledges the bug and claims it will be fixed in the next major release for the compiler (which I read as VC11/VS-whatever-is-after-2010 - probably not a service pack for VC10/VS2010):

from the comments, the fix appears to be already made to an internal compiler build.

零度° 2024-11-10 19:17:53

这段代码不应该编译 - 这是 VS 中的一个错误(或愚蠢的扩展)。 GCC 也应该拒绝它。该运算符在其使用范围内不可访问。

Comeau 正确对待这一点:

"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
          (declared at line 14) is inaccessible
     a << 4;

编辑:相关标准片段,来自 13.3/1

[注:选择的功能
无法保证重载解析
适合上下文。
其他限制,例如
该功能的可访问性,可以
在调用上下文中使用它
格式不正确。 ]

This code should not compile - this is a bug (or silly extension) in VS. GCC should refuse it as well. The operator is inaccessible in the scope it is used.

Comeau treats this correctly:

"ComeauTest.c", line 28: error: function "A::operator<<(const T &) [with T=int]"
          (declared at line 14) is inaccessible
     a << 4;

EDIT: A relevant standard snippet, from 13.3/1

[Note: the function selected by
overload resolution is not guaranteed
to be appropriate for the context.
Other restrictions, such as the
accessibility of the function, can
make its use in the calling context
ill-formed. ]

银河中√捞星星 2024-11-10 19:17:53

不,你并不愚蠢——它是损坏的代码,应该被拒绝。 Comeau 编译器 (http://www.comeaucomputing.com/tryitout) 确实正确地拒绝了它。

No, you're not stupid - it's broken code and should be rejected. The Comeau compiler (http://www.comeaucomputing.com/tryitout) does correctly reject it.

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