The nature of error is different than the one mentioned in this thread.
I am trying to implement an SFINAE way in VC++ environment which finds if a class contains a member (method) or not.
Below is a simplified code for that:
template<typename Class>
class HasMember_Method
{
typedef char (&yes)[2];
template<unsigned int> struct Exists;
template<typename V>
static yes CheckMember (Exists<sizeof(&V::Method)>*); // <--- VC++ problem
template<typename>
static char CheckMember (...);
public:
static const bool value = (sizeof(CheckMember<Class>(0)) == sizeof(yes));
};
Here Method
is the member method we are looking for. This code works perfectly fine in g++ environment even without C++11.
However the same results in a compiler error for buggy VC++:
error C2070: 'overloaded-function': illegal sizeof operand
I tried other workaround for SFINAE using decltype
, but no luck. Is there any fix or better work around exist for this problem?
Though below is the not right answer, it at least fixes the issue. In the code snippet, I changed 2 lines:
And this fixes the compilation issues in VS2010/12!
WAIT! That uncovers another flaw in the buggy VC++ compiler.
It always results in true. :(
The good old g++ works fine here as well.
So the correct answer is to wait for the Microsoft VC++ compiler team to fix these issues.