为啥这个私有模板函数会编译? -> 编译器错误 VS 2009

Posted

技术标签:

【中文标题】为啥这个私有模板函数会编译? -> 编译器错误 VS 2009【英文标题】: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");

【问题讨论】:

【参考方案1】:

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

http://connect.microsoft.com/VisualStudio/feedback/details/649496/visual-c-doesnt-respect-the-access-modifier-for-operator-member-function-templates

从 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) 确实正确拒绝了它。

【讨论】:

以上是关于为啥这个私有模板函数会编译? -> 编译器错误 VS 2009的主要内容,如果未能解决你的问题,请参考以下文章

为啥将 lambda 传递给受约束的类型模板参数会导致“不完整类型”编译器错误?

当我的代码超出函数范围时,为啥会出现编译器错误“未命名类型”?

为啥linux编译内核模块时报错,说找不到/sys/types.h,/sys/socket.h/等头文件???

为啥在尝试调用采用动态参数的基本构造函数/方法时会出现此编译错误?

为啥尝试使用显式类型参数调用模板成员函数时会出错?

C++:为啥必须声明私有函数?