【发布时间】:2019-10-22 16:32:29
【问题描述】:
在下面的代码中,我的意图是仅当模板参数T 具有operator+= 和operator*= 时才定义Weighted<T>::operator+=。它在 MSVC14 上运行良好,但 GCC(使用 6.3.0 测试)在指定位置(当 T 没有 operator*= 时)失败并出现错误“与 '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;
}
};
我应该怎么做?如果问题出在编译器的版本上,是否有一种简单的解决方法可以避免升级编译器?
【问题讨论】:
-
您使用的是哪个版本的
gcc?最新版本很乐意接受此代码。 -
@lubgr 我使用的是 GCC 6.3.0
-
请做一个完整的导致编译失败的例子。
-
value*=1.0不依赖于任何推导出的模板参数,因此您不会得到任何 SFINAE。另外,U是否有可能不是T? -
@Mark
U应始终与T相同。你能告诉我一个更好的方法来检查T是否有operator*=(double)?
标签: c++ gcc compiler-errors c++14 sfinae