|
Boost : |
Subject: [boost] [scope_exit] MSVC error C2355: 'this' : can only be referenced inside non-static member functions
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2010-08-25 19:49:37
Hello all,
I am trying to use Boost.ScopeExit parameter binding mechanism to
implement Boost.LocalFunction. To do so, I need to use some internal
ScopeExit code to detect the type of `this` and bind its value to the
local function declaration.
The following code works on GCC but not on MSVC... This appears to be
a MSVC 2008 bug:
http://connect.microsoft.com/VisualStudio/feedback/details/331418/erroneous-error-c2355-this-can-only-be-referenced-inside-non-static-member-functions
1) Can anyone please try this code on MSVC versions later than 2008 to
see if it was fixed?
2) Do you know of a workaround for this problem?
// File: lf03.cpp
#include <boost/scope_exit.hpp>
struct c {
void f() {
typedef void (*this_t)(int this_ );
#if defined(BOOST_MSVC) // for MSVC
typedef boost::type_of::msvc_typeid_wrapper<
sizeof(*boost::type_of::encode_start(
#else // for GCC
typedef __typeof__(
boost::type_of::ensure_obj(
#endif
boost::scope_exit::aux::wrap(
boost::scope_exit::aux::deref(
this, (this_t)0
)
)
)
#if defined(BOOST_MSVC) // for MSVC
)>::type
#else // for GCC
)
#endif
this_w;
}
};
int main() {
c cc;
cc.f();
return 0;
}
I get this error on MSVC 2008 but the code compiles just fine on GCC:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
lf03.cpp
using native typeof
lf03.cpp(17) : error C2355: 'this' : can only be referenced inside
non-static member functions
lf03.cpp(22) : error C2955: 'boost::type_of::msvc_typeid_wrapper' :
use of class template requires template argument list
C:\Program
Files\boost\boost_1_42\boost/typeof/msvc/typeof_impl.hpp(212) : see
declaration of 'boost::type_of::msvc_typeid_wrapper'
Thank you very much.
-- Lorenzo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk