c++ - 尾随返回类型中 SFINAE 的 GCC 错误

标签 c++ gcc compiler-errors c++14 sfinae

在我下面的代码中,我的意图是定义 Weighted<T>::operator+=仅当模板参数 Toperator+=operator*= .它在 MSVC14 上运行良好,但 GCC(使用 6.3.0 测试)失败并在指定位置出现错误“'operator*='不匹配”(当 T 没有 operator*= 时)。

template<typename T>
struct Weighted {
    double weight;
    T value;

    // ...

    // weighted mean
    template<typename U=T>
    auto operator+=(const Weighted<U>& other) -> decltype(value += other.value, value*=1.0, *this) {
// ***COMPILE ERROR*** ---------------------------------------------------->    ~~~~~^~~~~

        value *= weight;
        value += other.weight*other.value;
        weight += other.weight;
        value /= weight;
        return *this;
    }

    // scale weight
    Weighted<T>& operator*=(double multiplier) {
        weight *= multiplier;
        return *this;
    }
};

我应该怎么做?如果问题出在编译器的版本上,是否有一种简单的解决方法可以避免升级编译器?

最佳答案

template<typename U=T, typename = std::enable_if_t<std::is_same<U,T>::value>>
auto operator+=(const Weighted<U>& other) -> decltype(value += other.value, std::declval<U&>()*=1.0, *this) {
    // ...
}

还在第一行添加了一个检查以限制 UT 相同。

关于c++ - 尾随返回类型中 SFINAE 的 GCC 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489714/

相关文章:

c++ - 在 GCC 中添加到父目录的包含路径

c - gcc 找不到-lglfw3

c++ - 在 OpenCV 中设置像素值(奇怪的结果)

compiler-errors - Ocaml 错误 : Syntax error: ')' expected, 但我找不到在哪里

java - 使用 JFreeChart 在 Netbeans 中编译错误

c++ - 让 credis 在 C++ 解决方案中工作

c++ - Windows 上 HANDLE 的来源

c++ - 模板特化静态初始化 icc+vc vs gcc+clang

C++如何知道对象何时被销毁

c++ - 在 Win/Linux 上使用 C/C++ 使用大页面分配内存的最简单方法是什么?