2009-04-07 49 views
5

Lỗi:
lỗi C2678: nhị phân '==': không có nhà điều hành tìm thấy trong đó có một toán hạng trái của loại 'entry const' (hoặc không có chuyển đổi có thể chấp nhận)C++ lỗi lớp mẫu với toán tử ==

chức năng:

template <class T, int maxSize> 
int indexList<T, maxSize>::search(const T& target) const 
{ 
    for (int i = 0; i < maxSize; i++) 
     if (elements[i] == target) //ERROR??? 
      return i;  // target found at position i 

    // target not found 
    return -1; 
} 

indexList.h
indexList.cpp

đây có phải là giả sử là một nhà điều hành quá tải? Là một lớp mẫu tôi không chắc chắn tôi hiểu lỗi?

Solution- Chức năng quá tải trong lớp const nay tuyên bố:

//Operators 
bool entry::operator == (const entry& dE) const <-- 
{ 
    return (name ==dE.name); 

} 
+0

http://stackoverflow.com/a/38887476/1599699 – Andrew

Trả lời

9

Bắt đầu bằng cách đọc văn bản lỗi chính xác như nó là:

binary '==' : no operator found which takes a left-hand operand of type 'const entry'

Nó có nghĩa là nó không thể tìm thấy bất kỳ nhà điều hành == chấp nhận một loại entry như toán hạng trái của nó. Mã này không hợp lệ:

entry const e; 
if (e == foo) 

Bạn đã cho chúng tôi thấy mã cho lớp danh sách của bạn, nhưng đó không phải là lỗi. Lỗi là về việc thiếu các toán tử cho loại entry, bất kể đó là gì. Hoặc là cung cấp cho lớp một hàm operator== hoặc khai báo một hàm độc lập operator== chấp nhận tham số đầu tiên là const entry&.

struct entry { 
    bool operator==(const entry& other) const; 
}; 
// or 
bool operator==(const entry& lhs, const entry& rhs); 

Tôi nghĩ kiểu sau là kiểu được ưu tiên.

+0

Cảm ơn. Lớp của tôi đã có toán tử quá tải, nhưng hàm không được khai báo là const –

6

Vấn đề đề cập đến loại T đang được sử dụng trong trường hợp này không có một toán tử == xác định. Tôi sẽ đoán từ câu hỏi của bạn rằng đây là một 'mục' lớp.

Nó cũng có thể là lớp 'mục' không có toán tử == được xác định chính xác để lấy mục nhập const & làm tham số.

+0

Bingo, có thể là giá trị giải thích các định nghĩa chính xác mặc dù (hàm bạn bè inline) hoặc có thể có một số vấn đề liên kết * FUN * sau = D –

+0

tại sao các phần tử phải là const? –

+0

Vì phương thức mẫu của bạn được đánh dấu const. Điều đó có nghĩa rằng trình biên dịch phải kiểm tra xem bạn không gọi các hoạt động không phải const trên dữ liệu nội bộ của lớp (phần tử [i]) –

2

Đây có thể là "const ngộ độc", khi bạn sử dụng const trong tuyên bố chức năng tìm kiếm của bạn sẽ buộc bạn phải thêm const phiên bản của tất cả các chức năng hạ lưu mà bạn gọi.

Trong hàm được khai báo const, con trỏ this được coi là const, có nghĩa là tất cả các thành viên bạn sử dụng thông qua con trỏ đó cũng được coi là const. Nếu số operator ==() của bạn cho bất kỳ loại T nào mà bạn chuyên không xác định rõ ràng thông số const, bạn sẽ gặp phải lỗi này.

Nếu bạn không thể đảm bảo rằng tất cả Ts bạn sử dụng sẽ có các cuộc gọi thích hợp operator ==(), tôi sẽ xóa các thông số const trên các mẫu chức năng thành viên.

+0

Trong lớp mẫu toán tử == không được định nghĩa, nó có cần phải không? Cách tốt nhất để loại bỏ ngộ độc const này trên chức năng này là gì? –

+0

thuật ngữ "ngộ độc const" khá là gây hiểu nhầm. các const là có để giữ cho bạn khỏi những sai lầm và duy trì bạn khó khăn theo thứ tự. Nếu thêm một const vào một nơi có nghĩa là bạn cần phải thêm nó vào những nơi khác nó chỉ có nghĩa là bạn có lẽ nên làm như vậy trước đây. – shoosh

+0

Tôi chỉ cần xóa "const" theo các khai báo trong tiêu đề. Bạn có thể tạo một mẫu trình bao bọc cho phép const cho toán tử ==(), nhưng nó có khả năng gây rắc rối nhiều hơn giá trị của nó. – mwigdahl

1

Loại T bạn đang sử dụng làm tham số cho lớp này phải có mã operator==() vì mã bạn cung cấp không chứa sự diễn giải của mẫu mà khó biết được điều gì sai.

Trên một ghi chú khác, các định nghĩa hàm của mẫu phải nằm trong tệp .h cùng với lớp hoặc trình biên dịch khác sẽ không thể khởi tạo đúng cách.

+0

có định nghĩa trong .h –

1

Toán tử bình đẳng cho các loại do người dùng xác định không được xác định theo mặc định. Điều này không liên quan gì đến lớp mẫu của bạn, nhưng thay vào đó là mục nhập struct hoặc class "của bạn".

Vì vậy, bạn sẽ phải ghi đè toán tử bình đẳng trong struct entry hoặc class entry. Ngoài ra, nếu bạn không muốn ép buộc mọi thứ sử dụng mẫu đó để xác định toán tử bình đẳng, bạn có thể sửa đổi giao diện mẫu để chấp nhận một Trình so sánh thực hiện so sánh bình đẳng.

0

Đôi khi nó là khá đủ để viết

... 
    if (target == elements[i]) 
...