SFINAE 无法使用模板的成员函数 class

SFINAE not working with member function of template class

我有一个模板 class 如果类型满足某些条件,我想在其中删除一个成员函数,据我所知,这应该是 SFINAE 的一个非常基本的用法,例如:

template<class T>
class A
{
public:
    template<typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
    T foo () {
        return 1.23;
    }
};

然而,这会导致错误“没有名为 'type' 的类型”,就像 SFINAE 没有进行一样。但是,如果 foo 不是 class 的函数,则此方法有效。这个实现有什么问题?

您缺少供编译器用于 SFINAE 的相关名称。尝试这样的事情:

#include <type_traits>

template<class T>
class A
{
public:
    template<typename Tp = T>
    typename std::enable_if<std::is_floating_point<Tp>::value, Tp>::type
    foo () {
        return 1.23;
    }
};

int main() {
    A<double> a;
    a.foo();
}

如果类型 T 不是浮点数,声明将是错误的(没有 return 类型)并且函数不会被考虑用于重载集。

godbolt 上查看。