2011-09-21 23 views
9

Chức năng:Nguyên nhân gây lỗi trình biên dịch C++: phải có đối số của lớp hoặc liệt kê loại? khai


template <typename T> 
Point<T>* operator +(Point<T> const * const point, Vector<T> const * const vector); 

Nó được một lúc kể từ khi tôi đã sử dụng C++ như vậy có lẽ tôi đang làm một cái gì đó thực sự ngu ngốc. Cho tôi biết.

Ngoài ra, không, tôi không sử dụng không gian tên std.

Trả lời

8

Điều bạn đang làm sai ở đây ở cấp độ ngôn ngữ là toán tử quá tải cho con trỏ. Ít nhất một đối số của toán tử quá tải phải thuộc loại do người dùng xác định hoặc tham chiếu đến một.

Nhưng bạn cũng đang làm điều này sai ở một cấp độ khác. Bạn đang trả về một con trỏ, có nghĩa là bạn có thể sẽ cần phải phân bổ một số lưu trữ động trong toán tử. Vâng, ai sở hữu kho lưu trữ đó? Ai sẽ phát hành nó?

Bạn chỉ nên lấy tài liệu tham khảo và trả lại theo giá trị, một cái gì đó như:

template <typename T> 
Point<T> operator +(Point<T> const& point, Vector<T> const& vector) { 
    return Point<T>(point.x + vector.x, point.y + vector.y); 
} 
+0

Một trong những lý do tôi trả lại con trỏ là tôi không thể tìm ra cách để trả về giá trị. Tôi sẽ nhận được Điểm từ đâu? Tôi không thể tạo một cái mới() và trả lại nó như thế này. –

+0

@Doug: Tôi đã thêm một ví dụ, xem xét các lớp Điểm và Vector điển hình. Nếu bạn đến từ Java, điều đầu tiên bạn cần học là 'new' sẽ được sử dụng rất thường xuyên. –

+0

Loại phân bổ này có gì? Có phải bằng cách nào đó bị nhiễu với chức năng gọi điện không? –

4

Bạn không thể quá tải toán tử đối với các loại cơ bản, trong trường hợp của bạn, cả hai đối số đều là con trỏ. Thay vào đó, bạn có muốn tham chiếu không?

+0

Vì vậy, ngay cả khi đó là một con trỏ đến một số loại đặc biệt, tôi vẫn không thể quá tải không? –

+0

@DougTreadwell Thật khó để có con trỏ không trỏ đến một loại cụ thể phải không? ;) – quasiverse

+0

Ý tôi là, trỏ đến một loại do người dùng xác định. Nhưng tôi cho rằng trình biên dịch không nhìn vào những gì nó trỏ đến, chỉ là những gì nó được? –

4

Khi bạn xác định toán tử, ít nhất một đối số phải là lớp do người dùng xác định hoặc loại được liệt kê (hoặc tham chiếu đến một trong số các đối số đó). Con trỏ không đủ điều kiện như một trong những người. Bạn nên sử dụng các đối số tham chiếu và trả lại một điểm không đủ điều kiện là <T>.

+0

Tôi làm cách nào để trả lại Điểm không đủ tiêu chuẩn? –

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