【发布时间】:2019-05-19 15:56:24
【问题描述】:
为什么我必须在 std::enable_if 用法中使用默认值 (::type = 0)?
我看到了一些例子,没有它也能正常工作。例如https://foonathan.net/blog/2015/11/30/overload-resolution-4.html
#include<iostream>
#include<type_traits>
template <typename T,
typename std::enable_if<std::is_integral<T>::value, T>::type = 0>
void do_stuff(T t) {
std::cout << "do_stuff integral\n";
}
template <typename T,
typename std::enable_if<std::is_class<T>::value, T>::type = 0>
void do_stuff(T t) {
std::cout << "do_stuff class\n";
}
int main()
{
do_stuff(32);
return 0;
}
我收到错误消息:
temp.cpp:6:6: note: template argument deduction/substitution failed:
temp.cpp:18:13: note: couldn't deduce template parameter ‘<anonymous>’
应该推导出来
template <template T, int>
void do_stuff(T t)
这是一个有效的代码。 我做错了什么? (gcc 版本 7.4.0)
【问题讨论】:
-
在您引用的示例中,调用
enable_if是默认参数。它看起来像这样:typename = std::enable_if<...>::type。它是给定默认值的模板类型参数(省略其名称)。在您的代码中,您有一个std::enable_if<...>::type类型的非类型模板参数,无法推断它。 -
@IgorTandetnik 当我这样做时,我得到: temp.cpp:13:6: error: redefinition of 'template
void do_stuff(T)' void do_stuff(T t) { ^~~~~~~~ temp.cpp:7:6: 注意:'template void do_stuff(T)' 之前在这里声明过 void do_stuff(T t) { -
文中的例子也没有编译通过。可能是时候寻找更好的文章了。
-
@IgorTandetnik。这是 Jonathan Müller 的帖子 (twitter.com/foonathan)。它应该工作:)
-
@DanielLangr。是的,这是工作示例,我在问为什么 ::type = 0 必须在那里?尝试删除它。
标签: c++ c++11 templates sfinae