I'm trying to conditionally instantiate an extra assignment operator. The code below works fine in clang, but not in gcc 4.7.
The problem I'm having seems very similar the the question asked here: std::enable_if to conditionally compile a member function
The following illustrates the problem I'm having:
#include <type_traits>
template<typename T>
struct StrangerTypeRules;
template<typename T>
struct X;
template< >
struct StrangerTypeRules < unsigned > {
typedef unsigned type;
};
template< >
struct StrangerTypeRules < bool > {
typedef X<bool> type;
};
template<typename T>
struct X {
// In the non-trivial version of my code, I can not use the
// default assignment operator, therefor I need to define this one
X& operator=( const X<T>& rhs ) {
return *this;
}
// Alternative assignment oprtator, must only exists if it is
// different from the assignment operator above
template<typename =
typename std::enable_if<
( !std::is_same<
X<T>,
typename StrangerTypeRules<T>::type
>::value ),
X<T>
>::type
>
X<T> & operator=( const typename StrangerTypeRules <T>::type& rhs ) {
return *this;
}
};
int main(int argc, const char *argv[])
{
X<unsigned> x1, x2;
x1 = 4;
x2 = x1;
X<bool> x3, x4; // compile error in gcc 4.7 with -std=c++11
//x3 = x4;
return 0;
}
Can this be done in a way which satisfies both clang and gcc 4.7? If so, how?
Compilations error when using gcc:
test.cxx: In instantiation of ‘struct X<bool>’:
test.cxx:52:13: required from here
test.cxx:38:12: error: no type named ‘type’ in ‘struct std::enable_if<false, X<bool> >’