【发布时间】:2019-04-30 13:19:57
【问题描述】:
根据this answer,我一直在使用
template <typename T,
typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
作为多个类成员的函数签名,其中bool_verifier<T>() 是一个模板函数,它断言特定类T 满足某些要求,返回类型为constexpr bool。这确保了 classMember(const T& arg) 的特定重载仅用于特定的参数类型,但是当有多个具有相同原型/参数签名的重载时,不可能这样做,因为编译器不允许这样做:
// ...
template <typename T, typename = typename enable_if<bool_verfier<T>()>::type> >
classMember(const T& arg);
template <typename T, typename = typename enable_if<!(bool_verfier<T>())>::type>>
classMember(const T& arg);
// ...
导致以下编译错误:
‘template<class T, class> void myClass::classMember<T>(const T&)’
cannot be overloaded with
‘template<class T, class> void std::myClass<T>::classMember(const T&)’
如果我需要classMember 根据bool_verifier<T>() 是否返回true 有不同的定义,那么正确的语法/成员声明是什么?或者,有没有办法从#if 预编译器条件语句中调用bool_verifier<T>?
【问题讨论】:
-
“因为编译器不允许”。一如既往,提供minimal reproducible example 和错误消息...
-
@VittorioRomeo 大概是因为 enable if 被设置为默认值,这不是签名的一部分,导致重新定义
-
你有 C++17 吗?
-
@PiotrSkotnicki:当然,但是 OP 需要把它放在问题中。我们不应该做猜测
-
@VittorioRomeo 编译器不会精确地允许,因为没有编译器会接受具有相同原型的函数重载。我已经编辑了问题。
标签: c++ c++11 templates typetraits overloading