为啥这个私有模板函数会编译? -> 编译器错误 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/等头文件???