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

时间:2016-07-15 20:06:18

标签: c++ visual-studio templates c++11 enable-if

我正在尝试为类外的模板类定义模板成员函数,并利用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是问题。所以问题是:如何在不定义类内部函数的情况下使用enable_if来实现部分过载效果?

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

1 个答案:

答案 0 :(得分:1)

您还必须在声明中使用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