【问题标题】:Why does this private template function compile? -> Compiler Bug VS 2009为什么这个私有模板函数会编译? -> 编译器错误 VS 2009
【发布时间】:2011-04-28 20:48:58
【问题描述】:

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

【问题讨论】:

    标签: c++ templates compiler-bug


    【解决方案1】:

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

    从 cmets 看来,修复似乎已经针对内部编译器构建。

    【讨论】:

      【解决方案2】:

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

      Comeau 正确地处理了这一点:

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

      编辑:相关标准 sn-p,来自 13.3/1

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          相关资源
          最近更新 更多