2011-06-24 30 views
5

Điều này gây phiền nhiễu, tôi có thể viết một hàm với các tham số/trả về này, nhưng tại sao tôi không thể định nghĩa toán tử để thực hiện điều này?Tại sao tôi không thể sử dụng hai ptrs trong quá tải vận hành?

-edit- Tôi đang thực sự cố gắng quá tải << bên dưới chỉ để tham khảo.

From msdn

// C2803.cpp 
// compile with: /c 
class A{}; 
bool operator< (const A *left, const A *right); // C2803 
// try the following line instead 
// bool operator< (const A& left, const A& right); 

lỗi gcc

error: ‘bool operator<(const A*, const A*)’ must have an argument of class or enumerated type 
+0

Tình huống thực tế của bạn mà bạn cần so sánh đó là gì? –

+0

@Kerrek: Mã của tôi đang sử dụng ostringstream. Bây giờ tôi nhận ra tôi cần một ngăn xếp và cập nhật o. Tôi không thể sử dụng tài liệu tham khảo bc tài liệu tham khảo không thay đổi. Vì vậy, tôi cần một ptr. Tôi đã viết rất nhiều mã và muốn o

+0

Bạn không thể viết 'o << * rhs' thay thế? –

Trả lời

10

Bởi vì mỗi người dùng định nghĩa toán tử quá tải nhu cầu ít nhất một loại người dùng định nghĩa như một tham số. Điểm không phải là loại do người dùng xác định.

C++ 03 tiêu chuẩn, §13.5 [over.oper] p6:

Một chức năng điều hành có trách nhiệm hoặc là một hàm thành viên không tĩnh hoặc là một hàm phi thành viên và có ít nhất một tham số có kiểu là một lớp học, một tham chiếu đến một lớp, một điều tra, hoặc một tham chiếu đến một điều tra.

+0

vẫn còn, con trỏ có thể được bao gồm trong đó. Nhưng họ quyết định không. Tôi muốn biết lý trí đằng sau điều đó. Nó làm cho cuộc sống của tôi khó khăn hơn –

+0

Eh, làm thế nào họ có thể? Làm thế nào nó sẽ làm việc ra cho cả hai tham số được con trỏ? Có các toán tử nội trang xử lý các kiểu nội trang dựng sẵn, con trỏ là một trong số chúng. – Xeo

+0

AFAIK '<<' không thực sự có ý nghĩa gì đối với 'T *'. Và ngay cả khi nó tôi sẽ LIKE quá tải nó.các toán tử thực sự hoạt động, các hàm có thể làm những gì tôi yêu cầu. -edit- i đề cập đến việc sử dụng mã của tôi trong bình luận của tôi về câu hỏi của tôi –

3

Vì bạn không được phép gian lận.

Nếu bạn có thể ghi đè toán tử so sánh cho loại con trỏ, thì bạn sẽ không còn có thể so sánh các con trỏ đó theo giá trị (aka: theo giá trị con số thực tế). Và đó là loại quan trọng và đôi khi hữu ích.

Mã thực sự của tôi thực sự là < <. Tại sao tôi không thể sử dụng nó cho điều đó?

Vì lý do tương tự: con trỏ là C++ - loại cơ bản. Chúng không phải là loại do người dùng xác định. Bạn có muốn không thể chuyển đổi giá trị con trỏ trái không? OK, rõ ràng là bạn làm, nhưng C++ sẽ không cho bạn.

Bạn chỉ có thể ghi đè toán tử khi C++ không có chức năng hiện có cho các toán tử có các loại đó (với một vài ngoại lệ). C++ đã có nhà điều hành < và nhà điều hành < < cho con trỏ, vì vậy bạn không được phép thay đổi những gì họ làm.

+1

Tôi không nghĩ rằng bạn có thể thay đổi con trỏ anyway! –

+0

Có thể đó là nhà điều hành ostream ... – Nemo

+0

@Nemo ... nhưng "ostream's <<" hoạt động trên ... –

Các vấn đề liên quan