【发布时间】:2020-11-20 21:20:40
【问题描述】:
我正在思考为什么以下会导致编译错误。 我是元编程的新手,但根据我对 SFINAE 原则的理解,以下函数是互斥的,因此它不是对现有函数的“重新定义”。
#include <type_traits>
template<typename T>
using IsNotEnum = typename std::enable_if<!std::is_enum<T>::value>::type;
template<typename T>
using IsEnum = typename std::enable_if<std::is_enum<T>::value>::type;
template<typename T, typename = IsNotEnum<T>>
void doSomething()
{
}
template<typename T, typename = IsEnum<T>>
void doSomething()
{
}
g++ 7.5 抱怨如下:
error: redefinition of ‘template<class T, class> void doSomething()’
void doSomething()
^~~~~~~~~~~
note: ‘template<class T, class> void doSomething()’ previously declared here
void doSomething()
【问题讨论】:
-
这让我想起了this question
-
默认参数不是函数签名的一部分。
标签: c++ templates alias sfinae