为什么SFINAE在函数重载时报告错误
以下代码无法编译,我只想测试SFINAE,为什么无法编译?
#include <type_traits>
template<typename T>
class TestVoid {
template<std::enable_if_t<std::is_void_v<T>> * = nullptr>
void func() {
std::cout << "void\n";
}
template<std::enable_if_t<!std::is_void_v<T>> * = nullptr>
void func() {
std::cout << "none void\n";
}
};
int main() {
TestVoid<void> t;
return 0;
}
Follwing code can't compile,I just want testing SFINAE,why it can't compile?
#include <type_traits>
template<typename T>
class TestVoid {
template<std::enable_if_t<std::is_void_v<T>> * = nullptr>
void func() {
std::cout << "void\n";
}
template<std::enable_if_t<!std::is_void_v<T>> * = nullptr>
void func() {
std::cout << "none void\n";
}
};
int main() {
TestVoid<void> t;
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是
std::enable_if
的条件不依赖于func
本身的模板参数。您可以将代码更改为
LIVE
The problem is the conditions of
std::enable_if
don't depend on template parameter offunc
themselves.You might change the code to
LIVE
实例化类模板时,所有成员函数声明都必须有效。就你而言,其中之一不会。相反,您可以将
func
委托给另一个函数模板。实时链接
或者,如果您想将
func
的实际实现保留为成员函数:live链接
When you instantiate the class template, all of the member function declarations must be valid. In your case, one of them won't be. Instead, you can delegate
func
to another function template.live link
Or, if you want to keep the actual implementation of
func
as a member function:live link