SFINAE不能防止歧义的运算符重载吗?

问题描述 投票:1回答:1

我以为下面的代码可以编译,因为有冲突的重载已经消失了。但是编译器(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(){}
c++ compiler-errors operator-overloading c++14 sfinae
1个回答
0
投票

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
};
© www.soinside.com 2019 - 2024. All rights reserved.