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:\ dev \ test]
> g ++ foo.cpp -std = c ++ 0x

[d:\ dev \ test]
> _

Visual C ++ 10.0での結果:

[d:\ dev \ test]
> 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(void)
        ]
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++はdefault-intをサポートしていません
C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ INCLUDE \ xxcallwrap(10):エラーC4430:型指定子がありません-intと見なされます。注:C++はdefault-intをサポートしていません
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:\ dev \ test]
> _

Visual C ++コンパイラが、抽象クラスをインスタンス化できないことを11回ユーザーに通知する方法が気に入っています。たとえば、ユーザーが気付いていない場合に備えて、要点を理解するだけです。しかし、std::reference_wrapper本当にクラスをインスタンス化する必要がありますか?インスタンス化を必要としないという参照(通過)のポイントの多くはありませんか?

つまり、これは、私が強く疑うように、Visual C ++標準ライブラリの実装のバグですか?

4

1 に答える 1

4

質問の作者によって解決されました。これはVisual C++ 10.0のバグであり、VC の次のメジャー バージョンで修正される予定です。

于 2012-03-18T22:29:10.340 に答える