#include <type_traits>
struct A{};
struct B{};
template <typename T>
struct Foo
{
typename std::enable_if<std::is_same<T, A>::value>::type
bar()
{}
typename std::enable_if<std::is_same<T, B>::value>::type
bar()
{}
};
Komunikat o błędzie:Dlaczego funkcja SFINAE (enable_if) nie działa dla funkcji składowych szablonu klasy?
14:5: error: 'typename std::enable_if<std::is_same<T, B>::value>::type Foo<T>::bar()' cannot be overloaded 10:5:
error: with 'typename std::enable_if<std::is_same<T, A>::value>::type Foo<T>::bar()'
Źródło na cpp.sh. Myślałem, że zarówno typename std::enable_if<std::is_same<T,?>::value>::type
nie może być ważny w tym samym czasie.
Edit
Dla potomności tutaj jest moje edycji w oparciu o użytkownika @ KerrekSB odpowiedź - SFINAE działa tylko dla przewidywanych argumentów szablonu
#include <type_traits>
struct A{};
struct B{};
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U,A>::value>::type
bar()
{
}
template<typename U = T>
typename std::enable_if<std::is_same<U,B>::value>::type
bar()
{
}
};
int main()
{
};
* SFINAE działa tylko dla przewidywanych argumentów szablonu * ... To jest klucz !!!!! Dzięki wiązka @Kerrek. BTW, mój oryginalny post to MWE. – Olumide
@Olumide: Tak, tylko błędy zastąpienia, które wynikają z dedukcji, nie są błędami. Jawnie żądane zastępstwa zawodzą jako poważny błąd. (W tym przypadku wystarczy tylko MFE!). –
Czy istnieje sposób na przeciążenie takiego konstruktora? – Brent