c++ 模板 enable_if 无法将函数定义与现有声明相匹配

c++ template enable_if unable to match function definition to an existing declaration

我正在尝试在 class 之外为模板 class 定义模板成员函数,并利用 SFINAE 有效地部分重载该函数。我正在尝试的一个最小示例是:

Test.h:

template<typename T, size_t D>
class Test
{
public:
    Test(){}
    ~Test(){}

    template<size_t W = D, typename = int*>
    void do_something(Test&);
private:
    T data[D];
};

#include <type_traits>

template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
    exit(2);
}

template<typename T, size_t D>
template<size_t W, typename std::enable_if<W == 3, int>::type* = 0>
inline void Test<T, D>::do_something(Test &)
{
    exit(3);
}

Main.cpp:

int main(int, char**) {
    Test<float, 2> t1;
    Test<float, 2> t2;
    t1.do_something(t2);
    return 0;
}

但是此代码示例产生错误:C2244 'Test::do_something':无法将函数定义与现有声明相匹配。如果我改变

template<size_t W, typename std::enable_if<W == 2, int>::type* = 0>

 template<size_t W, typename Type>

并删除 do_something 的其他定义,然后代码将毫无问题地编译,所以我知道 enable_if 是问题所在。那么问题来了:如何在class中不定义函数的情况下使用enable_if实现部分重载的效果?

应该补充一点,我正在使用 MSVS 2015 进行编译。

您还必须在声明中使用 std::enable_if

template<typename T, std::size_t D>
class Test
{
public:
    template<std::size_t W, typename std::enable_if<W == 2>::type* = nullptr>
    void do_something(Test<T, W> &);

    template<std::size_t W, typename std::enable_if<W == 3>::type* = nullptr>
    void do_something(Test<T, W> &);
};



template<typename T, std::size_t D>
template<std::size_t W, typename std::enable_if<W == 2>::type*>
void Test<T, D>::do_something(Test<T, W> &)
{
    std::cout << 1 << std::endl;
}

template<typename T, std::size_t D>
template<std::size_t W, typename std::enable_if<W == 3>::type*>
void Test<T, D>::do_something(Test<T, W> &)
{
    std::cout << 2 << std::endl;
}

Demo