Xét đoạn mã sau:Tại sao trình biên dịch không thể suy ra tham số mẫu khi được sử dụng với toán tử chuyển đổi?
#include <utility>
template<typename T>
struct wrapper {
T value;
};
struct foo {
operator wrapper<int>() {
return{10};
}
};
int main() {
foo f;
wrapper w = f; // error
std::pair p = std::make_pair(1, 0); // ok
}
gcc 7.1.1 thất bại trong việc biên dịch tại dòng rõ rệt trên:
main.cpp: In function 'int main()': main.cpp:17:17: error: class template argument deduction failed: wrapper w = f; // error ^ main.cpp:17:17: error: no matching function for call to 'wrapper(foo&)' main.cpp:4:8: note: candidate: template<class T> wrapper(wrapper<T>)-> wrapper<T> struct wrapper { ^~~~~~~ main.cpp:4:8: note: template argument deduction/substitution failed: main.cpp:17:17: note: 'foo' is not derived from 'wrapper<T>' wrapper w = f; // error ^
f
là mui trần để wrapper<int>
, vì vậy tôi hy vọng điều đó xảy ra. Từ đó trình biên dịch có thể suy ra rằng T
là int
. Nhưng nó không thể.
Trình biên dịch có thể suy ra chính xác thông số mẫu của std::pair
một cách chính xác, vì vậy tôi tự hỏi tại sao đây không phải là trường hợp với wrapper
.
Bất kỳ ý tưởng nào?
IMO sẽ rất khó hiểu nếu khấu trừ mẫu lớp học được xem xét trong các toán tử chuyển đổi. Nếu cần, bạn nên sử dụng hướng dẫn khấu trừ rõ ràng. – cpplearner
Liên quan: https://stackoverflow.com/q/43019240/1896169 – Justin
trình bao bọc cấu trúc toán tử 'này là gì()'? nó có khai báo 'toán tử wrapper' hoặc' toán tử() '? –
cat