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年
你必須使用'的std :: enable_if'也宣言。 – Jarod42
因此,就你而言,你可能只是使用重載。 – Jarod42