【发布时间】:2012-03-19 00:36:47
【问题描述】:
代码:
#include <functional>
struct Foo
{
virtual void mf() = 0;
};
struct Bar: Foo
{
virtual void mf() {}
};
int main()
{
Bar o;
std::reference_wrapper<Foo const> wrapper( o );
}
MinGW g++ 4.6.1 的结果:
[d:\开发\测试] > g++ foo.cpp -std=c++0x [d:\开发\测试] > _
Visual C++ 10.0 的结果:
[d:\开发\测试] > cl foo.cpp foo.cpp C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(371) :请参阅对正在编译的类模板实例化 'std::tr1::_Call_wrapper' 的引用 和 [ _Callable=std::tr1::_Callable_obj ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(416) :请参阅对正在编译的类模板实例化 'std::tr1::_Refwrap_impl' 的引用 和 [ _Ty=const Foo ] foo.cpp(16) : 请参阅正在编译的类模板实例化 'std::tr1::reference_wrapper' 的引用 和 [ _Ty=const Foo ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2027: 使用未定义类型 'std:: tr1::_Result_of' 和 [ _Ty=const Foo (空) ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9):错误 C2143:语法错误:缺少“;”前 '(' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(10):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : 错误 C2259: 'Foo' : 无法实例化抽象类 由于以下成员: 'void Foo::mf(void)' : 是抽象的 foo.cpp(5) : 见 'Foo::mf' 的声明 [d:\开发\测试] > _
我喜欢 Visual C++ 编译器 11 次告诉用户抽象类无法实例化的方式,只是为了强调这一点,以防用户不知道这一点。但是std::reference_wrapper 真的应该实例化这个类吗?对 not 的引用(传递)的意义不是很大吗?
也就是说,我强烈怀疑,这是否是 Visual C++ 标准库实现中的错误?
【问题讨论】:
-
我向微软提交了bug report。
-
您不应该使用 ref 辅助函数创建 reference_wrapper 吗?
-
微软对此的回答是:“我们已经修复了它,修复将在 VC11 RTM 中可用。(但是,修复没有进入 VC11 Beta。)”想知道会发生什么使用 VC10,是否会推出另一个服务包?
-
你应该回答这个问题,即使它是你的,并接受它。不是为了代表,而是为了完成。答案看起来更像是答案而不是评论(我想知道为什么...... duh)
-
@DavidRodríguez-dribeas,我想知道为什么。像 SO once 这样的网站是沟通的渠道。当它们施加太多开销、太多麻烦时,人们就会停止使用它们。你能想象有足够聪明的人从中受益,需要“帮助”才能得到一个“答案”吗?我想不是。 :-)
标签: c++ visual-c++ c++11 pass-by-reference c++-standard-library