Question

Here's a sample program:

#include <type_traits>
#include <stdio.h>

template <typename X>
struct test
{
    operator int() const { puts("?"); return 0; }
    template <typename T, typename = typename std::enable_if<std::is_same<X, void*>::value, T>::type>
    operator T() const { puts("T"); return 0; }
};

int main()
{
    test<void*> t;
    char* c = (char*)t;
    switch (t)
    {
        case 0: break;
    }
    return 0;
}

And this is the error that g++-4.7 gives

user@user:~$ g++-4.7 -std=c++0x test.cpp
test.cpp: In function ‘int main()’:
test.cpp:13:14: error: ambiguous default typeconversion from ‘test<void*>’
test.cpp:13:14: error:   candidate conversions include ‘template<class T, class> test::operator void*() const [with T = T; <template-parameter-2-2> = <template-parameter-1-2>; X = void*]’

g++ 4.6 compiles it without errors and different operators are actually called.

Is there a way to make this work under g++ 4.7?

UPDATE: actually it works in 4.6 without any enable_if at all... so the question still applies but I'm now not sure if enable_if will help.

Was it helpful?

Solution 2

I found at least one "acceptable" solution:

#define switch(x) \
    switch( (typename switch_type<__typeof(x)>::type)(x) )

which switch_type trait can be extended to resolve ambiguity for specific app-related types (property types).

OTHER TIPS

If you add an explicit cast to int here:

switch ((int)t)

Then it should compile.

I think it's complaining about the conversion being ambiguous since there exists more than one type that can hold a 0 value.

I'm using g++ 4.8 though.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top