为什么这个私有模板函数能够编译? ->编译器错误 VS 2009
这在 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");
}
This compiles with out problems in VS 2009? Am I stupid?
GCC gives a warning, that the template is private....?
What am I missing?
#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");
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
微软承认了这个错误,并声称它将在编译器的下一个主要版本中修复(我将其理解为 VC11/VS-whatever-is-after-2010 - 可能不是 VC10/VS2010 的服务包):
从评论来看,修复似乎已经针对内部编译器构建进行了。
Microsoft acknowledges the bug and claims it will be fixed in the next major release for the compiler (which I read as VC11/VS-whatever-is-after-2010 - probably not a service pack for VC10/VS2010):
from the comments, the fix appears to be already made to an internal compiler build.
这段代码不应该编译 - 这是 VS 中的一个错误(或愚蠢的扩展)。 GCC 也应该拒绝它。该运算符在其使用范围内不可访问。
Comeau 正确对待这一点:
编辑:相关标准片段,来自 13.3/1
This code should not compile - this is a bug (or silly extension) in VS. GCC should refuse it as well. The operator is inaccessible in the scope it is used.
Comeau treats this correctly:
EDIT: A relevant standard snippet, from 13.3/1
不,你并不愚蠢——它是损坏的代码,应该被拒绝。 Comeau 编译器 (http://www.comeaucomputing.com/tryitout) 确实正确地拒绝了它。
No, you're not stupid - it's broken code and should be rejected. The Comeau compiler (http://www.comeaucomputing.com/tryitout) does correctly reject it.