4

这在 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");
}
4

3 回答 3

3

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

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

于 2011-04-28T21:00:26.030 回答
1

此代码不应编译 - 这是 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

[注意:重载决议选择的函数不能保证适合上下文。其他限制,例如函数的可访问性,可能使其在调用上下文中的使用格式错误。]

于 2011-04-28T20:55:01.983 回答
0

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

于 2011-04-28T20:56:20.747 回答