c++ 模板 enable_if 无法将函数定义与现有声明相匹配
c++ template enable_if unable to match function definition to an existing declaration
我正在尝试在 class 之外为模板 class 定义模板成员函数,并利用 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 是问题所在。那么问题来了:如何在class中不定义函数的情况下使用enable_if实现部分重载的效果?
应该补充一点,我正在使用 MSVS 2015 进行编译。
您还必须在声明中使用 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;
}
我正在尝试在 class 之外为模板 class 定义模板成员函数,并利用 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 是问题所在。那么问题来了:如何在class中不定义函数的情况下使用enable_if实现部分重载的效果?
应该补充一点,我正在使用 MSVS 2015 进行编译。
您还必须在声明中使用 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;
}