Why is class A
compiling and class B
not compiling, where the compiler complains about having two declarations, are not both relying on SFINAE?
Both should actually use template type deduction when using foo
?
So the question really is, whats the subtle different in these two version
and why is class A
successfully using sfinae...?
- Class A uses a value-defaulted (zero) annonymous (not necessary) non-type template parameter
- Class B uses a type-defaulted (with enable_if) annonymous type template parameter
The code:
template<typename T>
struct A
{
template<typename U,
typename std::enable_if<!std::is_floating_point<U>::value>::type * = nullptr
>
void foo() {}
template<typename U,
typename std::enable_if<std::is_floating_point<U>::value>::type * = nullptr
>
void foo() {}
};
template<typename T>
struct B
{
template<typename U,
typename = typename std::enable_if<!std::is_floating_point<U>::value>::type
>
void foo() {}
template<typename U,
typename = typename std::enable_if<std::is_floating_point<U>::value>::type
>
void foo() {}
};
Live code at: http://coliru.stacked-crooked.com/a/40ec5efc7ba2a47c