Необходимо сделать enable_if
зависимым от параметра шаблона. Как и сейчас, он зависит только от внешнего параметра шаблона в определении шаблона. Но если вы создаете экземпляр класса из внешнего шаблона, тогда ваш шаблон оператора присваивания, который создается в этом классе, больше не зависит от параметра шаблона, поскольку T
уже будет подставлено.
Просто введите фиктивный параметр, равный T
template<typename T1 = T, typename =
typename std::enable_if<
( !std::is_same<
X<T1>,
typename StrangerTypeRules<T1>::type
>::value ),
X<T1>
>::type
>
X<T1> & operator=( const typename StrangerTypeRules <T1>::type& rhs ) {
return *this;
}
Использование T1
только в одном из мест в аргументах шаблона enable_if<...>
уже будет достаточным, потому что это уже делает enable_if
зависимым.
Однако это не вызов вашего operator=
, который был ранее не информирован, а его объявление , которое конфликтует с оператором копирования-назначения, поэтому enable_if
здесь мало полезного Просто замените свой код на
template<typename T1 = T>
X<T1> & operator=( const typename StrangerTypeRules <T1>::type& rhs ) {
return *this;
}
Поскольку этот operator=
является шаблоном, он не будет конфликтовать с не шаблонной перегрузкой. А также потому, что это шаблон, когда вы его называете, компилятор предпочтет не шаблон, если T
равно X<T>
.