コード:4.6.1 ++ MinGWのgを有するstd :: reference_wrapperのVisual C++ 10.0バグ?
#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);
}
結果:ビジュアルC++ 10.0と
[d:\dev\test] >g++ foo.cpp -std=c++0x [d:\dev\test] > _
結果:
[d:\dev\test] >cl foo.cpp foo.cpp C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(371) : see reference to class template instantiation 'std::tr1::_Call_wrapper' being compiled with [ _Callable=std::tr1::_Callable_obj ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xrefwrap(416) : see reference to class template instantiation 'std::tr1::_Refwrap_impl' being compiled with [ _Ty=const Foo ] foo.cpp(16) : see reference to class template instantiation 'std::tr1::reference_wrapper' being compiled with [ _Ty=const Foo ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2027: use of undefined type 'std:: tr1::_Result_of' with [ _Ty=const Foo (void) ] C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9) : error C2143: syntax error : missing ';' before '(' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(9) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(10) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\INCLUDE\xxcallwrap(8) : error C2259: 'Foo' : cannot instantiate abstract class due to following members: 'void Foo::mf(void)' : is abstract foo.cpp(5) : see declaration of 'Foo::mf' [d:\dev\test] > _
私は、Visualそのように好きC++コンパイラは抽象クラスをインスタンス化できないことをユーザーに11回伝えます。ユーザがそのことを知らなかった場合のように、ホームを指す。しかし、std::reference_wrapper
は本当にクラスをインスタンス化する必要がありますか? への参照(渡す)参照のポイントの多くではないインスタンス化が必要ですか?
これは、私が強く疑うが、Visual C++標準ライブラリ実装のバグですか?
私は[バグレポート](https://connect.microsoft.com/VisualStudio/feedback/details/727368/std-reference-wrapper-fails-to-wrap-reference-to-object-of-abstract)を提出しました。 -class)をマイクロソフトに送信します。 –
refヘルパー関数を使用してreference_wrapperを作成してはいけませんか? –
@ jamesj:いいえ。これは型を明示的に指定しないようにするヘルパー関数です。バグを調査するには、暗黙的なものより明示的なものを持つ方が良いです。 –