cuốn sách gpt4 ai đã làm

Tại sao SFINAE không hoạt động cho việc này?

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:20:20 26 4
mua khóa gpt4 Nike

Tôi đang viết một số mã điểm đơn giản trong khi dùng thử Visual Studio 10 (Beta 2) và tôi đã sử dụng mã này khi tôi muốn SFINAE bắt đầu, nhưng có vẻ như không:

mẫu
điểm cấu trúc {
T x, y;
điểm(T x, T y): x(x), y(y) {}
};

mẫu
cấu trúc op_div {
typedef decltype(T() / U()) loại;
};

mẫu
điểm::type>
toán tử/(point const& l, point const& r) {
điểm trả về::type>(lx/rx, ly/ry);
}

mẫu
điểm::type>
toán tử/(điểm const& l, U const& r) {
điểm trả về::type>(lx / r, ly / r);
}

int chính() {
point(0, 1) / point(2, 3);
}

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

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

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

Cảm ơn!


*:原文:

mẫu
cấu trúc op_div {
static T t(); static U u();
typedef decltype(t() / u()) type;
};

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

câu trả lời hay nhất

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

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

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

mẫu
tự động
operator/(point const& l, point const& r) -> point {
return {l.x / r.x, l.y / r.y};
}

mẫu
tự động
operator/(point const& l, U const& r) -> point {
return {l.x / r, l.y / r};
}

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

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress