Lỗi C++: Không quá tải khả thi '=':

Loi C Khong Qua Tai Kha Thi



Lỗi là các hoạt động có thể là kết quả của hoạt động bất thường của bất kỳ mã nào. Không thể phát hiện lỗi tại thời điểm viết cho đến khi chúng tôi thực thi mã hoặc mã được biên dịch. Một số lỗi cấm mã thực thi cho đến khi chúng bị xóa. Hôm nay, chúng ta cũng sẽ thảo luận về một lỗi cũng xảy ra khi biên dịch chương trình, đó là “error: no match for ‘operator=’”. Lỗi này có thể do các nguyên nhân như: chúng ta đã truyền con trỏ vào nơi chuỗi sẽ được truyền, sửa đổi biến hằng, v.v. Để loại bỏ lỗi “no viable quá tải” không khó nhưng nhiệm vụ chính là hiểu lỗi vì nó chỉ hiển thị lỗi mà không có bất kỳ mô tả nào về lỗi.

cú pháp

Không có cú pháp được xác định trước như vậy cho lỗi này bởi vì nó không phải là một phần của mã hoặc đầu ra, nó chỉ là một sự mơ hồ có thể do mã sai. Như chúng ta có thể thấy, bên dưới là một ví dụ về lỗi có thể trông như thế nào.







lỗi : không có trận đấu 'nhà điều hành =

Ví dụ # 01:

Hãy cho chúng tôi biết về lỗi này và phương pháp giải quyết vấn đề này. Để hiểu rõ hơn, chúng ta sẽ thực hiện một ví dụ trong đó chúng ta sẽ chuyển tên bằng cách sử dụng các đối tượng cho hàm và sau đó hàm sẽ hiển thị chúng. Trước tiên, chúng tôi sẽ bao gồm tệp tiêu đề iostream. Sau đó, chúng ta sẽ khai báo một lớp tên là “my_object”. Trong đó, chúng tôi đã khai báo hai biến chuỗi có tên là “F_name và “L_name”, “F_name” cho biết tên của người đó trong khi “L_name” cho biết họ của người đó.



Tiếp theo, chúng tôi đã khai báo một hàm tạo công khai có tên là “my_object()”, trong đó chúng tôi đã gán giá trị null cho cả hai biến “F_name” và “L_name”. Sau đó, chúng ta đã khai báo một hàm khác mà chúng ta đã truyền các biến kiểu chuỗi “fn” và “ln”. Bên trong đó, chúng tôi đã gọi phương thức name_set(). Sau đó, chúng ta khai báo hai hàm thành viên “show()” và “name_set()”. Khi hàm “show() được gọi, nó sẽ hiển thị tên và họ cùng nhau. Trong khi đó, trong hàm thành viên “set_name()”, chúng ta đã truyền hai biến chuỗi kiểu chuỗi “fn” và “ln” mà chúng ta cũng đã truyền cho hàm tạo thứ hai.



Bây giờ, bằng cách sử dụng toán tử gán sao chép của lớp my_object, chúng ta lấy một tham số kiểu “my_object”. Trình biên dịch luôn khai báo nó là thành viên công khai nội tuyến của bất kỳ lớp nào. Bên trong thành viên này, chúng tôi đã gán src.F_name cho “F_name” và src.L_name cho “L_name” mà chúng tôi đã giữ lại bản sao của “F_name” và “L_name”. Điều này được chuyển cho các thành viên của lớp my_object. Bây giờ, chúng tôi đã khai báo một đối tượng của lớp my_cobject có tên là “name1” mà chúng tôi đã chuyển hai chuỗi “Anna” và “smith” làm đối số. Điều này sẽ gọi hàm tạo và hiển thị tên cùng với họ.





Sau đó, chúng ta tạo một đối tượng khác “name2” rồi gán tên riêng cho đối tượng đó. Sau khi chuyển các giá trị cho hàm tạo cho cả hai đối tượng, chúng tôi đã gọi phương thức show(), phương thức này sau đó sẽ hiển thị tên cho cả hai đối tượng “nam1” và “name2”. Khi kết thúc mã, chúng tôi đã trả về giá trị null và thực thi mã của mình.

bao gồm
lớp my_object {
riêng :
tiêu chuẩn :: sợi dây F_name, L_name ;
công cộng :
my_object ( ) { F_name = '' ; L_name = '' ; }
my_object ( tiêu chuẩn :: sợi dây fn, tiêu chuẩn :: sợi dây ln ) {
tên_bộ ( fn, ln ) ;
}
khoảng trống buổi bieu diễn ( ) { tiêu chuẩn :: cout << 'Tên là ' << F_name << '' << L_name << “. \N ' ; }
khoảng trống tên_bộ ( tiêu chuẩn :: sợi dây fn, tiêu chuẩn :: sợi dây ln ) { F_name = fn ; L_name = ln ; }
my_object & nhà điều hành = ( hăng sô my_object & src ) {
F_name = src. F_name ;
L_name = src. L_name ;
trở về * đây ;
}

} ;
int chính ( int argc, than ** argv ) {
my_object name1 ( 'Anna' , 'thợ rèn' ) ;
my_object name2 ;
tên2 = ( 'Anna' , 'thợ rèn' ) ;
tên1. buổi bieu diễn ( ) ;
tên2. buổi bieu diễn ( ) ;
trở về 0 ;
}

Sau khi thực thi mã của chúng tôi, chúng tôi gặp lỗi này hiển thị rằng chúng tôi đã viết sai mã trên dòng 24 cho biết loại lỗi gặp phải “lỗi: không khớp với ‘operator=’”. Bây giờ, chúng tôi sẽ cố gắng giải quyết lỗi này.



Để giải quyết lỗi này, chúng tôi có nhiều cách để chuyển các giá trị tới hàm tạo của bất kỳ lớp nào. Trong phương thức đầu tiên, chúng ta sẽ chỉ gán đối tượng “name1” cho “name2” vì chúng ta đã truyền các giá trị giống nhau cho cả hai đối tượng nên không cần phải truyền chúng một cách riêng biệt. Bây giờ chúng tôi thực thi mã.

int chính ( int argc, than ** argv ) {

my_object name1 ( 'Anna' , 'thợ rèn' ) ;
my_object name2 ;
tên2 = tên1 ;
tên1. buổi bieu diễn ( ) ;
tên2. buổi bieu diễn ( ) ;

Sau khi thực hiện các thay đổi đối với mã như được hiển thị ở trên, chúng tôi có kết quả được đưa ra trong đoạn mã bên dưới. Chúng tôi đã hiển thị tên được truyền cho hàm tạo được hiển thị thành công mà không có bất kỳ lỗi nào.

Phương pháp thứ hai để giải quyết lỗi này là khi chúng ta phải truyền các giá trị khác nhau cho cả hai đối tượng. Chúng ta sẽ chỉ sử dụng tên lớp cùng với các giá trị được truyền cho hàm tạo làm đối số. Chúng tôi chuyển tên đầu tiên là “jhone” và tên thứ hai là “smith”. Sau đó, chúng tôi thực thi mã.

int chính ( int argc, than ** argv ) {

my_object name1 ( 'Anna' , 'thợ rèn' ) ;
my_object name2 ;
tên2 = my_object ( 'John Smith' ) ;

tên1. buổi bieu diễn ( ) ;
tên2. buổi bieu diễn ( ) ;

Sau khi thực thi đoạn mã được thêm ở trên, chúng ta có đầu ra như hình bên dưới. Đối với đối tượng “name1”, nó hiển thị tên “Anna smith” và đối với đối tượng thứ hai “name2”, nó hiển thị “Jhone Smith”. Nhưng lần này mã của chúng tôi hoạt động bình thường mà không có bất kỳ lỗi nào trong đó.

Bây giờ, chúng tôi sẽ thử một phương pháp khác để thực thi thành công mã của chúng tôi. Như trong các trường hợp trên, chúng tôi đã cố gắng gán các giá trị cho các đối tượng bằng toán tử gán. Nhưng lần này, chúng ta sẽ truyền các giá trị tại thời điểm khai báo đối tượng. Như chúng ta có thể thấy trong đoạn mã bên dưới, tại thời điểm khai báo đối tượng “name1”, chúng ta đã chuyển các giá trị dưới dạng đối số cho đối tượng lặp lại bước tương tự cho “name2”. Bây giờ, chúng tôi thực thi mã một lần nữa.

int chính ( int argc, than ** argv ) {
my_object name1 ( 'Anna' , 'thợ rèn' ) ;
my_object name2 ( 'John Smith' ) ;
tên1. buổi bieu diễn ( ) ;
tên2. buổi bieu diễn ( ) ;

Sau khi mã được thực thi trong thời gian này, chúng tôi không gặp phải bất kỳ lỗi nào, điều đó có nghĩa là điều này cũng sẽ ngăn chúng tôi gặp bất kỳ lỗi nào.

Sự kết luận

Chúng ta đã thảo luận ngắn gọn về một lỗi mà chúng ta có thể gặp phải khi làm việc với các hàm được truy cập từ các lớp. Chúng tôi cũng đã tìm hiểu nguyên nhân và cách khắc phục lỗi “no viable quá tải”. Phần lớn lỗi này khó hiểu đối với các lập trình viên mới, vì vậy chúng tôi đã cố gắng giúp họ dễ dàng loại bỏ lỗi này bằng cách triển khai các ví dụ và kèm theo lời giải thích.