我以为下面的代码可以编译,因为有冲突的重载已经消失了。但是编译器(GCC)表示:void Foo<X>::bar(Xd) const' cannot be overloaded
。有没有容易解决的方法,还是我必须专门研究整个Foo
?
#include <type_traits>
struct A{};
template<typename X>
struct Foo {
template<typename Xd=X, typename = std::enable_if_t<std::is_arithmetic<Xd>::value>>
void bar() const {
}
template<typename Xd=X, typename = std::enable_if_t<std::is_same<Xd,A>::value>>
void bar() const {
}
};
int main(){}
从the reference for std :: enable_if:
一个常见的错误是声明两个仅不同的函数模板在其默认模板参数中。这不起作用,因为声明被视为相同功能的重新声明模板(函数中未考虑默认模板参数模板等价)。
/*** WRONG ***/
struct T {
enum { int_t,float_t } m_type;
template <typename Integer,
typename = std::enable_if_t<std::is_integral<Integer>::value>
>
T(Integer) : m_type(int_t) {}
template <typename Floating,
typename = std::enable_if_t<std::is_floating_point<Floating>::value>
>
T(Floating) : m_type(float_t) {} // error: treated as redefinition
};
/* RIGHT */
struct T {
enum { int_t,float_t } m_type;
template <typename Integer,
std::enable_if_t<std::is_integral<Integer>::value, int> = 0
>
T(Integer) : m_type(int_t) {}
template <typename Floating,
std::enable_if_t<std::is_floating_point<Floating>::value, int> = 0
>
T(Floating) : m_type(float_t) {} // OK
};