gpt4 book ai didi

c++模板enable_if无法将函数定义与现有声明匹配

转载 作者:行者123 更新时间:2023-11-30 05:25:12 25 4
gpt4 key购买 nike

我正在尝试为类外的模板类定义模板成员函数,并利用 SFINAE 有效地部分重载该函数。我正在尝试的一个最小示例是:

测试.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);
}

主要.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:

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

关于c++模板enable_if无法将函数定义与现有声明匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38404314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com