Tôi đang cố gắng để nạp chồng toán tử < < như một người bạn để mẫu Pair lớp, nhưng tôi tiếp tục nhận được một cảnh báo trình biên dịch nóiđiều hành bạn quá tải << cho lớp mẫu
friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function
cho mã này:
friend ostream& operator<<(ostream&, Pair<T,U>&);
nó mang lại một cảnh báo thứ hai như một đề nghị nói
if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
Đây là định nghĩa hàm
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
out << v.val1 << " " << v.val2;
}
và đây là toàn bộ lớp.
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream&, Pair<T,U>&);
private:
T val1;
U val2;
};
Tôi không chắc chắn nên rút ra gì từ cảnh báo đề xuất, ngoài điều đó có lẽ tôi phải đặt ở đâu đó trong tuyên bố kết bạn. Có ai biết cú pháp thích hợp cho việc này không? Cảm ơn.
+1 này thực sự là những gì các trình biên dịch được khiếu nại. Câu trả lời khác đề cập đến vấn đề với cách giải quyết: thay vì nói với trình biên dịch rằng người bạn là chuyên môn hóa của khuôn mẫu nó tạo ra một hàm << toán tử không được lập biểu mẫu cho các kiểu đã cho. –
Tôi đồng ý với David; đây là giải pháp tốt nhất về mặt thực hành tốt nhất và lập trình tốt. – Andry
Wow, phần bổ sung '<>' rất dễ bỏ lỡ! – Nick