2016-07-15 98 views
1

我想为类之外的模板类定义模板成员函数,并利用SFINAE有效部分重载函数。什么我想一个最小的例子是:C++模板enable_if无法将函数定义与现有声明匹配

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年

+0

你必须使用'的std :: enable_if'也宣言。 – Jarod42

+0

因此,就你而言,你可能只是使用重载。 – Jarod42

回答

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

相关问题