gpt4 book ai didi

c++ - 为什么SFINAE不适用于这个?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:20 26 4
gpt4 key购买 nike

我在试用 Visual Studio 10(Beta 2)时正在编写一些简单的点代码,并且我已经在我希望 SFINAE 启动的地方使用了这段代码,但它似乎没有:

template<typename T>
struct point {
T x, y;
point(T x, T y) : x(x), y(y) {}
};

template<typename T, typename U>
struct op_div {
typedef decltype(T() / U()) type;
};

template<typename T, typename U>
point<typename op_div<T, U>::type>
operator/(point<T> const& l, point<U> const& r) {
return point<typename op_div<T, U>::type>(l.x / r.x, l.y / r.y);
}

template<typename T, typename U>
point<typename op_div<T, U>::type>
operator/(point<T> const& l, U const& r) {
return point<typename op_div<T, U>::type>(l.x / r, l.y / r);
}

int main() {
point<int>(0, 1) / point<float>(2, 3);
}

这给出了 error C2512: 'point<T>::point' : no appropriate default constructor available

鉴于它是测试版,我对在线 comeau 编译器进行了快速完整性检查,它同意一个相同的错误,所以看起来这种行为是正确的,但我不明白为什么。

在这种情况下,一些解决方法是简单地内联 decltype(T() / U()) ,给点类一个默认构造函数,或者在完整的结果表达式上使用 decltype,但是我在尝试简化一个不需要默认构造函数*的 op_div 版本的错误时遇到了这个错误,所以我宁愿修正我对 C++ 的理解,而不是只做有效的事情。

谢谢!


*:原文:

template<typename T, typename U>
struct op_div {
static T t(); static U u();
typedef decltype(t() / u()) type;
};

这给出了 error C2784: 'point<op_div<T,U>::type> operator /(const point<T> &,const U &)' : could not deduce template argument for 'const point<T> &' from 'int' , 以及 point<T> / point<U>过载。

最佳答案

不能 100% 确定。看起来编译器需要实例化两个重载以确定哪个更好,但是在尝试用 T = int 实例化另一个 op_div 时和 U = point<float> ,这会导致 SFINAE 未涵盖的错误(错误不是 op_div 在这种情况下没有类型,而是无法确定该类型)。

如果第二种类型是点 ( boost::disable_if ),您可以尝试禁用第二次重载。

此外,延迟返回类型声明(取消 op_div 结构,但取决于您的编译器支持哪些 C++0x 功能)似乎有效:

template<typename T, typename U>
auto
operator/(point<T> const& l, point<U> const& r) -> point<decltype(l.x / r.x)> {
return {l.x / r.x, l.y / r.y};
}

template<typename T, typename U>
auto
operator/(point<T> const& l, U const& r) -> point<decltype(l.x / r)> {
return {l.x / r, l.y / r};
}

关于c++ - 为什么SFINAE不适用于这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com