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