Tôi xin lỗi điều này nghe có vẻ giống như một câu hỏi phổ biến, tôi không thể tìm thấy câu trả lời cho vấn đề của mình như tôi thấy. Bài đăng gần nhất sẽ là bài đăng này: Template Specialization for basic POD onlyLoại xung đột trong quá tải nhà điều hành mẫu
Giả sử tôi có một lớp template <class T> class A {...};
và tôi muốn quá tải toán tử + làm toán tử nhị phân nội bộ (hai đối tượng loại A) và làm toán tử hỗn hợp A và số POD loại).
Lý tưởng nhất, những gì tôi muốn viết là:
#include <type_traits>
using namespace std;
// Declare/fine template
template <class T> class A {...};
// Internal binary operator
template < class T, class U >
A< typename common_type<T,U>::type >
operator+ (const A<T> &a, const A<U> &a) { ... }
// Mixed binary operator
template < class T, class U >
A< typename common_type<T,U>::type >
operator+ (const A<T> &a, const U &b) { ... }
Nhưng sau đó nó có vẻ như định nghĩa thứ hai là mâu thuẫn với cái đầu tiên. Sử dụng định nghĩa thứ hai, tôi biết làm thế nào để đảm bảo U là một loại POD số, đó không phải là vấn đề. Nếu tôi đi theo cách đó, vấn đề là tôi không có cách nào để biết loại mẫu cơ bản nào được bao bọc trong U nếu đó là một số A.
Hãy cho tôi biết nếu câu hỏi của tôi không rõ ràng và cảm ơn trước! :)
EDIT: Các đặc điểm kỹ thuật mẫu đã bị xóa bởi bộ lọc HTML, trong câu cuối cùng của tôi "U nếu nó là một số A<T>
". Tóm lại, tôi nói T bị ẩn.
'template, U> :: giá trị, khoảng trống> :: type> A :: type> toán tử + (const A & a, const U &b); 'nên thực hiện thủ thuật. –
Morwenn
Ý bạn là gì bởi" kiểu mẫu cơ sở được bao bọc trong U "? Nhà điều hành hỗn hợp sẽ không được chọn nếu U là' A 'vì nội bộ là Bạn có muốn đối xử với vụ án 'A < A>' trong toán tử nội bộ không? –
pmr
Cảm ơn tất cả vì sự giúp đỡ của bạn. Bạn đã đúng, vấn đề thực sự xảy ra trước đây, vì common_type. nhập giữa 'A' và U, chúng tôi là bort trước khi trận đấu tốt nhất có thể được đánh giá. Morwenn, giải pháp của bạn trông giống như một cái gì đó tôi đã cố gắng, nhưng không chính xác trong bối cảnh này; U có thể là 'A
' với S!= T, và tôi vẫn có thể thực hiện thao tác. – Sheljohn