为什么这个私有模板函数编译? - >编译器Bug VS 2009

时间:2011-04-28 20:48:58

标签: c++ templates compiler-bug

这可以解决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");
}

3 个答案:

答案 0 :(得分:3)

Microsoft承认该错误并声称它将在下一个主要版本的编译器中修复(我将其读作VC11 / VS-无论是在2010之后 - 可能不是VC10 / VS2010的服务包):< / p>

从注释中,修复似乎已经对内部编译器构建。

答案 1 :(得分: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

  

[注意:选择的功能   不保证重载分辨率   适合上下文。   其他限制,如   功能的可访问性,可以   在调用上下文中使用它   病态的。 ]

答案 2 :(得分:0)

不,你不是傻瓜 - 这是破碎的代码,应该被拒绝。 Comeau编译器(http://www.comeaucomputing.com/tryitout)确实正确拒绝它。