電子書籍の厳選無料作品が豊富!

複数の代入オペレーターオーバーロードとキャストオペレーターオーバーロードが定義されてる時の優先順位について。

ポインターPのラッパークラスCを作成し、

CからPへのキャストオペレーター関数と
PからCへの代入オペレーター関数
CからCへの代入オペレーター関数を定義し
CからCへの代入をしたところ
C→P→Cという変換がかかってしまい
思わぬ結果を招いてしまいました。

この副作用を避けたいのですが、優先順位を変える方法はありますか。

stl::stringがconst char*へのキャストを用意せず、
c_strで取り出さないといけないのは不便だと思ってましたが、これが理由だったのかも、とすれば無理なのかなと思ってます。

質問者からの補足コメント

  • 原因が判明しました。

    C variable1; (実際にはメンバー変数)
    variable1 = C(arg1,arg2,arg3);

    のような代入を行っている箇所だったのですが、

    ためしにポインタPからの代入オペレータをコメントアウトしたところ、
    該当する代入オペレータがないというようなコンパイルエラーになりました。

    C& operator=(C&) というようにconstをつけてませんでした。
    これを
    C& operator=(const C&)
    と直したところ、コンパイルがとおり、
    ポインタPからの代入オペレータのコメントアウトを元に戻して
    実行しても問題はなくなりました。

    ありがとうございました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/04/07 00:24

A 回答 (2件)

いちおう念の為補足:



「CからCへの代入オペレーター関数」を直接呼び出すことができるのであれば, わざわざ「C→P→Cという変換」をすることはなくその代入演算子関数を実行します. 逆にいえば「C→P→Cという変換」をしたときことは, なんらかの理由で「CからCへの代入オペレーター関数」が直接呼び出せなかったため「CからPへのキャストオペレーター関数」と「PからCへの代入オペレーター関数」を呼び出したということが想定されます.

ということはわかるんだけど, この質問文ではそれ以上のことが一切わかりません. 特に「『CからCへの代入オペレーター関数』を直接呼び出せない理由」がまったくわからないので, 「どうすればいいのか」には答えようがありません.

これらの関数の宣言と「CからCへの代入」で実際にやっていることがわかればまだ考えようもあるんだけど, ね.
この回答への補足あり
    • good
    • 1
この回答へのお礼

確かに小さいテストプログラムを書いて見たところ、その通りでした。いま当該ソースコードがある場所に居らず確認ができないのですが、何処かに変数の型を間違える等のケアレスミスがある問題の気がしてきました。
ありがとうございます。
戻ったらソース確認して見ます。

お礼日時:2017/04/06 06:59

これだけだとわからないねぇ. この問題が発生するなるべく小さなプログラムを実際に書いてもらえませんか?

    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!