C++ エラー: 実行可能なオーバーロードされた ‘=’ はありません:

C Era Shi Xing Ke Nengnaobarodosareta Haarimasen



エラーは、コードの異常な動作の結果である可能性がある操作です。コードを実行するかコンパイルするまで、執筆時点ではエラーを検出できません。一部のエラーは、削除されるまでコードの実行を禁止します。今日は、プログラムのコンパイル時にも発生するエラー、つまり「エラー: ‘operator=’ が一致しません」についても説明します。このエラーは、次のような理由で発生する可能性があります: 文字列を渡す場所にポインターを渡した場合、定数変数を変更した場合などエラーの説明なしでエラーを表示するだけなので、エラーを理解してください。

構文

このエラーはコードや出力の一部ではないため、このような定義済みの構文はありません。間違ったコードが原因で発生する可能性のあるあいまいさです。ご覧のとおり、以下はエラーがどのように見えるかの例です。







エラー : 歯が立たない 為に 'オペレーター =

例 # 01:

このエラーとこれを解決する方法について考えてみましょう。よりよく理解するために、オブジェクトを使用して名前を関数に渡し、それを表示する例を実行します。まず、ヘッダー ファイル iostream をインクルードします。その後、「my_object」という名前のクラスを宣言します。その中で、「F_name」と「L_name」という名前の 2 つの文字列変数を宣言しました。「F_name」は人の名前を示し、「L_name」は人の姓を示します。



次に、変数「F_name」と「L_name」の両方に null 値を割り当てた「my_object()」という名前のパブリック コンストラクターを宣言しました。その後、文字列型変数「fn」と「ln」を渡した別の関数を宣言しました。その中で name_set() メソッドを呼び出しました。次に、2 つのメンバ関数「show()」と「name_set()」を宣言しました。 「show()」関数が呼び出されると、名と姓が一緒に表示されます。一方、「set_name()」メンバー関数では、文字列型「fn」と「ln」の 2 つの文字列変数を渡し、これも 2 番目のコンストラクターに渡しました。



ここで、クラス my_object のコピー代入演算子を使用して、タイプ「my_object」のパラメーターを 1 つ取得します。コンパイラは常に、それを任意のクラスのインライン パブリック メンバーとして宣言します。このメンバー内で、src.F_name を「F_name」に割り当て、src.L_name を「L_name」に割り当て、「F_name」と「L_name」のコピーを保持しています。これはクラス my_object のメンバーに渡されます。ここで、「name1」という名前のクラス my_cobject のオブジェクトを宣言し、2 つの文字列「Anna」と「smith」を引数として渡しました。これにより、コンストラクターが呼び出され、名と姓が表示されます。





その後、別のオブジェクト「name2」を作成し、そのオブジェクトに個別に名前を割り当てました。両方のオブジェクトのコンストラクターに値を渡した後、show() メソッドを呼び出して、オブジェクト「nam1」と「name2」の両方の名前を表示します。コードの最後で null 値を返し、コードを実行しました。

含む
クラス my_object {
プライベート :
標準 :: ストリング F_name、L_name ;
公衆 :
my_object ( ) { F_name = ' ' ; L_name = ' ' ; }
my_object ( 標準 :: ストリング fn、標準 :: ストリング ) {
name_set ( fn、ln ) ;
}
空所 見せる ( ) { 標準 :: カウト << '名前は ' << F_name << ' ' << L_name << '。 \n ' ; }
空所 name_set ( 標準 :: ストリング fn、標準 :: ストリング ) { F_name = fn ; L_name = ; }
my_object & オペレーター = ( 定数 my_object & ソース ) {
F_name = src。 F_name ;
L_name = src。 L_name ;
戻る * これ ;
}

} ;
整数 主要 ( 整数 argc、 チャー ** argv ) {
my_object name1 ( 「アンナ」 「スミス」 ) ;
my_object name2 ;
名前2 = ( 「アンナ」 「スミス」 ) ;
名前1。 見せる ( ) ;
名前2。 見せる ( ) ;
戻る 0 ;
}

コードの実行後、24 行目に誤ったコードを記述したことを示すこのエラーが表示され、発生したエラーの種類を示す「エラー: ‘operator=’ に一致しません」と表示されます。ここで、このエラーを解決しようとします。



このエラーを解決するために、任意のクラスのコンストラクターに値を渡す方法が複数あります。最初の方法では、「name1」オブジェクトを「name2」に単純に割り当てます。これは、両方のオブジェクトに同じ値を渡したので、別々に渡す必要がないためです。次に、コードを実行します。

整数 主要 ( 整数 argc、 チャー ** argv ) {

my_object name1 ( 「アンナ」 「スミス」 ) ;
my_object name2 ;
名前2 = 名前1 ;
名前1。 見せる ( ) ;
名前2。 見せる ( ) ;

上記のようにコードに変更を加えた後、以下のスニペットに示す結果が得られます。コンストラクタに渡された名前がエラーなしで正常に表示されました。

このエラーを解決する 2 つ目の方法は、両方のオブジェクトに異なる値を渡す必要がある場合です。クラス名と、コンストラクターに引数として渡される値を使用するだけです。最初の名前「jhone」と 2 番目の名前「smith」を渡しました。次に、コードを実行しました。

整数 主要 ( 整数 argc、 チャー ** argv ) {

my_object name1 ( 「アンナ」 「スミス」 ) ;
my_object name2 ;
名前2 = my_object ( 'ジョンスミス' ) ;

名前1。 見せる ( ) ;
名前2。 見せる ( ) ;

上記のコードを実行すると、以下のような出力が得られます。オブジェクト「name1」には名前「Anna smith」が表示され、2 番目のオブジェクト「name2」には「Jhone Smith」が表示されました。しかし、今回のコードはエラーなしで適切に動作しました。

ここで、コードを正常に実行するための別の方法を試します。上記の場合と同様に、代入演算子を使用して値をオブジェクトに代入しようとしました。今回は、オブジェクトの宣言時に値を渡します。以下のスニペットでわかるように、オブジェクト「name1」の宣言時に、値を引数としてオブジェクトに渡し、「name2」に対して同じ手順を繰り返します。ここで、もう一度コードを実行します。

整数 主要 ( 整数 argc、 チャー ** argv ) {
my_object name1 ( 「アンナ」 「スミス」 ) ;
my_object name2 ( 'ジョンスミス' ) ;
名前1。 見せる ( ) ;
名前2。 見せる ( ) ;

今回もコードが実行された後、エラーは発生していません。つまり、エラーが発生するのを防ぐこともできます。

結論

クラスからアクセスされる関数に取り組んでいるときに直面する可能性のあるエラーについて簡単に説明しました。また、「実行可能なオーバーロードがありません」というエラーを解決するための原因と方法についても調査しました。ほとんどの場合、このエラーは新しいプログラマーには理解するのが難しいため、例を実装して説明することで、これを簡単に取り除くことができるようにしました。