14

代码:

#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真的应该实例化这个类吗?(通过)引用的重点不是不需要实例化吗?

即,正如我强烈怀疑的那样,这是 Visual C++ 标准库实现中的错误吗?

4

1 回答 1

4

由问题作者解决。这是 Visual C++ 10.0 中的一个错误,据说在 VC 的下一个主要版本中已修复。

于 2012-03-18T22:29:10.340 回答