[英]using template aliases combined with partial specialization of templates
我正在思考为什么以下会导致编译错误。 我是元编程的新手,但根据我对 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()
尝试按如下方式重写您的函数
template<typename T, IsNotEnum<T> = nullptr>
void doSomething()
{
}
template<typename T, IsEnum<T> = nullptr>
void doSomething()
{
}
和您的using
s 如下
template <typename T>
using IsNotEnum = typename std::enable_if<!std::is_enum<T>::value, std::nullptr_t>::type;
template <typename T>
using IsEnum = typename std::enable_if<std::is_enum<T>::value, std::nullptr_t>::type;
或者简单地说,如果你有一个 C++14 或更新的编译器,
template <typename T>
using IsNotEnum = std::enable_if_t<!std::is_enum<T>::value, std::nullptr_t>;
template <typename T>
using IsEnum = std::enable_if_t<std::is_enum<T>::value, std::nullptr_t>;
您的代码中的问题是您不能编写两个不同的函数,这些函数仅针对模板默认类型/值有所不同。
因此,删除默认值后,SFINAE 不会禁用不需要的功能。 所以你有一个函数冲突。
仅删除类型(在等号左侧)SFINAE 删除不需要的功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.