Ví dụ của tôi dưới đây cho thấy rằng chuyển đổi tiềm ẩn từ các loại không phải mẫu đến các loại mẫu sẽ không hoạt động trơn tru như các loại chỉ liên quan đến các loại không phải mẫu. Có cách nào để làm cho họ làm việc dù sao?Chuyển đổi ẩn thành mẫu
Ví dụ:
struct point;
template<unsigned d> struct vec {
vec() { }
// ...
};
template<> struct vec<2> {
vec() { }
vec(const point& p) { /* ... */ } // Conversion constructor
// ...
};
struct point {
operator vec<2>() { return vec<2>(/* ... */); } // Conversion operator
};
template<unsigned d> vec<d> foo(vec<d> a, vec<d> b) {
return vec<d>(/* ... */);
}
template<unsigned d1, unsigned d2>
vec<d1 + d2> bar(vec<d1> a, vec<d2> b) {
return vec<d1 + d2>(/* ... */);
}
int main(int argc, char** argv) {
point p1, p2;
vec<2> v2;
vec<3> v3;
foo(v2, p1);
foo(p2, v2);
foo(p1, p2);
bar(v3, p1);
}
Có cách nào để cho mã này tự động chuyển đổi point
-vec<2>
?
Tôi biết tôi có thể quá tải foo
và bar
để cho phép point
lập luận, ủy thác cho việc thực hiện vec
sử dụng một chuyển đổi rõ ràng. Nhưng làm điều này cho tất cả các kết hợp tham số sẽ trở nên tẻ nhạt, đặc biệt đối với các hàm có nhiều tham số như vậy. Vì vậy, tôi không quan tâm đến các giải pháp mà tôi phải lặp lại mã cho mỗi kết hợp tham số của mọi chức năng.
Dường như cả nhà xây dựng chuyển đổi lẫn toán tử truyền đều không đủ để đạt được điều này. Ít nhất gcc 4.7.1 của tôi báo cáo no matching function call
, mặc dù nó đặt tên cho chức năng mong muốn trong thông báo, nêu rõ rằng ‘point’ is not derived from ‘vec<d>’
.
Dòng nào cho lỗi đó? Ngoài ra, 'unsigned' không phải là kiểu C++. –
@James: Các lỗi được báo cáo cho các dòng có lời gọi hàm, mặc dù các thông báo cũng đề cập đến các dòng khác nhau. Vui lòng sao chép và biên dịch mã ở trên, vì nó là khép kín. Phần 3.9.1 của [tiêu chuẩn C++ 11] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf) tên 'unsigned', vậy tại sao đó không phải là loại C++, được chia sẻ với C? – MvG
Không, nó khai báo 'unsigned char',' unsigned short int', 'unsigned int',' unsigned long int' và 'unsigned long long int' như các loại số nguyên không dấu. –