2016-07-15 35 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

相關問題