Search

std::reference_wrapper fails to wrap reference to object of abstract class by Alf P. Steinbach, except MS doesn't accept it

Closed
as Fixed Help for as Fixed

1
0
Sign in
to vote
Type: Bug
ID: 727368
Opened: 2/29/2012 3:53:28 PM
Access Restriction: Public
Moderator Decision: Sent to Engineering Team for consideration
1
Workaround(s)
0
User(s) can reproduce this bug
std::reference_wrapper fails to wrap reference to object of abstract class.
it oes not compile.
the std lib code attempts to instantiate the class.
Details (expand)

Visual Studio/Team Foundation Server/.NET Framework Tooling version

Visual Studio 2010 SP1

Steps to reproduce

http://stackoverflow.com/questions/9500588/visual-c-10-0-bug-in-stdreference-wrapper

#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 );
}

Product Language

English

Operating System

Windows Vista

Operating System Language

English

Actual results

[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]
> _

Expected results

[d:\dev\test]
> g++ foo.cpp -std=c++0x

[d:\dev\test]
> _
File Attachments
File Name Submitted By Submitted On File Size  
foo.cpp 2/29/2012 209 bytes
Sign in to post a comment.
Posted by Microsoft on 3/1/2012 at 7:04 PM
Hi,

Thanks for reporting this bug. We've already fixed it, and the fix will be available in VC11 RTM. (However, the fix didn't get into the VC11 Beta.)

If you have any further questions, feel free to E-mail me at stl@microsoft.com .

Stephan T. Lavavej
Visual C++ Libraries Developer
Posted by MS-Moderator09 [Feedback Moderator] on 2/29/2012 at 7:10 PM
Thank you for submitting feedback on Visual Studio 2010 and .NET Framework. Your issue has been routed to the appropriate VS development team for review. We will contact you if we require any additional information.
Posted by MS-Moderator01 on 2/29/2012 at 6:41 PM
Thank you for your feedback, we are currently reviewing the issue you have submitted. If this issue is urgent, please contact support directly(http://support.microsoft.com)
Sign in to post a workaround.
Posted by Alf P. Steinbach, except MS doesn't accept it on 2/29/2012 at 3:55 PM
Define your own trivial ref wrapper (like 6 to 10 lines of code) instead of using the bungled & apparently extremely complicated implementation of std::reference_wrapper in Microsoft's C++ standard library.