コード:
#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 ++標準ライブラリの実装のバグですか?