C++ 오류: 실행 가능한 오버로드 '=' 없음:

C Olyu Silhaeng Ganeunghan Obeolodeu Eobs Eum



오류는 코드의 비정상적 작동으로 인해 발생할 수 있는 작업입니다. 코드를 실행하거나 컴파일할 때까지 작성 시점에 오류를 감지할 수 없습니다. 일부 오류는 제거될 때까지 코드 실행을 금지합니다. 오늘은 프로그램 컴파일 시에도 발생하는 오류인 “error: no match for 'operator='”에 대해서도 알아보겠습니다. 이 오류는 다음과 같은 이유로 발생할 수 있습니다. 문자열을 전달할 포인터를 전달했는지, 상수 변수를 수정했는지 등. '실행 가능한 오버로드 없음' 오류를 제거하는 것은 어렵지 않지만 주요 작업은 다음과 같습니다. 오류에 대한 설명 없이 오류만 표시하기 때문에 오류를 이해합니다.

통사론

이 오류는 코드의 일부가 아니거나 잘못된 코드로 인해 발생할 수 있는 모호성일 뿐이므로 이 오류에 대해 미리 정의된 구문이 없습니다. 보시다시피 아래는 오류의 예입니다.







오류 : 경기가 없다 ~을 위한 '운영자 =

예 # 01:

이 오류에 대한 아이디어와 이를 해결하는 방법을 알려드리겠습니다. 더 잘 이해하기 위해 개체를 사용하여 이름을 함수에 전달한 다음 표시하는 예제를 수행합니다. 먼저 헤더 파일 iostream을 포함합니다. 그런 다음 'my_object'라는 클래스를 선언합니다. 그 안에 우리는 'F_name'과 'L_name'이라는 두 개의 문자열 변수를 선언했습니다. 'F_name'은 사람의 이름을 나타내고 'L_name'은 사람의 성을 나타냅니다.

다음으로 'F_name' 및 'L_name' 변수에 null 값을 할당한 'my_object()'라는 공용 생성자를 선언했습니다. 그런 다음 문자열 유형 변수 'fn'과 'ln'을 전달한 다른 함수를 선언했습니다. 그 안에서 우리는 name_set() 메서드를 호출했습니다. 그런 다음 두 개의 멤버 함수 'show()'와 'name_set()'을 선언했습니다. 'show() 함수가 호출되면 이름과 성을 함께 표시합니다. 반면 'set_name()' 멤버 함수에서는 두 번째 생성자에도 전달한 문자열 유형 'fn' 및 'ln'의 두 문자열 변수를 전달했습니다.

이제 my_object 클래스의 복사 할당 연산자를 사용하여 'my_object' 유형의 매개변수 하나를 가져옵니다. 컴파일러는 항상 이를 모든 클래스의 인라인 공용 멤버로 선언합니다. 이 멤버 내에서 'F_name'에 src.F_name을 할당하고 'F_name' 및 'L_name'의 복사본을 유지한 'L_name'에 src.L_name을 할당했습니다. 이것은 my_object 클래스의 구성원에게 전달됩니다. 이제 'Anna'와 'smith'라는 두 개의 문자열을 인수로 전달한 'name1'이라는 my_cobject 클래스의 개체를 선언했습니다. 이것은 생성자를 호출하고 성과 함께 이름을 표시합니다.

그런 다음 다른 개체 'name2'를 만든 다음 해당 개체에 별도로 이름을 지정했습니다. 두 개체의 생성자에 값을 전달한 후 show() 메서드를 호출하여 'nam1' 및 'name2' 개체의 이름을 모두 표시합니다. 코드 끝에서 null 값을 반환하고 코드를 실행했습니다.

포함
수업 my_object {
사적인 :
성병 :: F_이름, L_이름 ;
공공의 :
my_object ( ) { F_이름 = ' ' ; L_이름 = ' ' ; }
my_object ( 성병 :: fn, 표준 :: ) {
name_set ( fn, ln ) ;
}
무효의 보여 주다 ( ) { 성병 :: 쿠우트 << '그 이름은 ' << F_이름 << ' ' << L_이름 << '. \N ' ; }
무효의 name_set ( 성병 :: fn, 표준 :: ) { F_이름 = fn ; L_이름 = ; }
my_object & 운영자 = ( const my_object & 소스 ) {
F_이름 = src. F_이름 ;
L_이름 = src. L_이름 ;
반품 * 이것 ;
}

} ;
정수 기본 ( 정수 인수, ** 인수 ) {
my_object 이름1 ( '안나' , '스미스' ) ;
my_object 이름2 ;
이름2 = ( '안나' , '스미스' ) ;
이름1. 보여 주다 ( ) ;
이름2. 보여 주다 ( ) ;
반품 0 ;
}

코드를 실행한 후 'error: no match for 'operator=''에서 발생한 오류 유형을 나타내는 잘못된 코드를 24행에 작성했음을 표시하는 오류가 있습니다. 이제 이 오류를 해결하려고 합니다.

이 오류를 해결하기 위해 클래스의 생성자에 값을 전달하는 여러 가지 방법이 있습니다. 첫 번째 방법에서는 'name1' 개체를 'name2'에 할당합니다. 두 개체에 동일한 값을 전달했기 때문에 별도로 전달할 필요가 없습니다. 이제 코드를 실행합니다.

정수 기본 ( 정수 인수, ** 인수 ) {

my_object 이름1 ( '안나' , '스미스' ) ;
my_object 이름2 ;
이름2 = 이름1 ;
이름1. 보여 주다 ( ) ;
이름2. 보여 주다 ( ) ;

위와 같이 코드를 변경한 후 아래 스니펫에 결과가 표시됩니다. 생성자에 전달된 이름이 오류 없이 성공적으로 표시되었음을 표시했습니다.

이 오류를 해결하는 두 번째 방법은 두 개체에 서로 다른 값을 전달해야 하는 경우입니다. 인수로 생성자에 전달될 값과 함께 클래스 이름을 사용하기만 하면 됩니다. 첫 번째 이름인 'jhone'과 두 번째 이름인 'smith'를 전달했습니다. 그런 다음 코드를 실행했습니다.

정수 기본 ( 정수 인수, ** 인수 ) {

my_object 이름1 ( '안나' , '스미스' ) ;
my_object 이름2 ;
이름2 = my_object ( '존 스미스' ) ;

이름1. 보여 주다 ( ) ;
이름2. 보여 주다 ( ) ;

위에서 추가한 코드를 실행하면 아래와 같이 출력됩니다. 'name1' 개체의 경우 'Anna smith'라는 이름을 표시하고 두 번째 개체 'name2'의 경우 'Jhone Smith'를 표시했습니다. 그러나 이번에는 코드가 오류 없이 제대로 작동했습니다.

이제 코드를 성공적으로 실행하기 위한 다른 방법을 시도해 보겠습니다. 위의 경우와 마찬가지로 할당 연산자를 사용하여 개체에 값을 할당하려고 했습니다. 하지만 이번에는 객체 선언 시점의 값을 전달하겠습니다. 아래 스니펫에서 볼 수 있듯이 'name1' 개체를 선언할 때 'name2'에 대해 동일한 단계를 반복하여 개체에 값을 인수로 전달했습니다. 이제 코드를 다시 한 번 실행합니다.

정수 기본 ( 정수 인수, ** 인수 ) {
my_object 이름1 ( '안나' , '스미스' ) ;
my_object 이름2 ( '존 스미스' ) ;
이름1. 보여 주다 ( ) ;
이름2. 보여 주다 ( ) ;

이 시간 동안 코드가 실행된 후에도 오류가 발생하지 않았으므로 오류가 발생하지 않습니다.

결론

클래스에서 액세스하는 함수를 작업하는 동안 발생할 수 있는 오류에 대해 간략하게 논의했습니다. 또한 'no viable overloaded' 오류의 원인과 해결 방법을 연구했습니다. 대부분 이 오류는 초보 프로그래머가 이해하기 어렵기 때문에 예제를 구현하고 설명을 통해 쉽게 제거할 수 있도록 노력했습니다.