【发布时间】:2015-06-12 16:01:13
【问题描述】:
我遇到了关于 enable_if 和模板专业化的适当使用的问题。
修改示例后(出于保密原因),这是一个可比较的示例:
我有一个名为“less”的函数,它检查第一个参数是否小于第二个 参数。假设我想要两种不同的实现 取决于输入的类型 - 1 实现整数和 另一个双倍。
我目前的代码是这样的 -
#include <type_traits>
#include <iostream>
template <class T,
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
bool less(T a, T b) {
// ....
}
template <class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool less(T a, T b) {
// ....
}
int main() {
float a;
float b;
less(a,b);
return 0;
}
上面的代码无法编译,因为 - 它说我正在重新定义 less 方法。
错误是:
Z.cpp:15:19: error: template parameter redefines default argument
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
Z.cpp:9:19: note: previous default template argument defined here
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
^
Z.cpp:16:11: error: redefinition of 'less'
bool less(T a, T b) {
^
Z.cpp:10:11: note: previous definition is here
bool less(T a, T b) {
^
Z.cpp:23:5: error: no matching function for call to 'less'
less(a,b);
^~~~
Z.cpp:15:43: note: candidate template ignored: disabled by 'enable_if'
[with T = float]
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
3 errors generated.
谁能指出这里的错误是什么?
【问题讨论】:
-
基本上你没有正确使用
enable_if,因为你调用返回类型的方式。 -
快速解决方案是在任一模板中添加省略号参数
...,以便将它们视为不同的重载。 -
或将签名改为
template <class T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
标签: c++ templates c++11 sfinae enable-if