【问题标题】:Can SFINAE not prevent ambiguous operator overloads?SFINAE 不能防止模棱两可的运算符重载吗?
【发布时间】:2020-01-25 23:58:46
【问题描述】:

我认为以下代码可以编译,因为冲突的重载被 SFINAE 消除了。但是编译器(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】:

    来自the reference 用于 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
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2013-11-18
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多