複数の代入オペレーターオーバーロードとキャストオペレーターオーバーロードが定義されてる時の優先順位について。
ポインターPのラッパークラスCを作成し、
CからPへのキャストオペレーター関数と
PからCへの代入オペレーター関数
CからCへの代入オペレーター関数を定義し
CからCへの代入をしたところ
C→P→Cという変換がかかってしまい
思わぬ結果を招いてしまいました。
この副作用を避けたいのですが、優先順位を変える方法はありますか。
stl::stringがconst char*へのキャストを用意せず、
c_strで取り出さないといけないのは不便だと思ってましたが、これが理由だったのかも、とすれば無理なのかなと思ってます。
No.2ベストアンサー
- 回答日時:
いちおう念の為補足:
「CからCへの代入オペレーター関数」を直接呼び出すことができるのであれば, わざわざ「C→P→Cという変換」をすることはなくその代入演算子関数を実行します. 逆にいえば「C→P→Cという変換」をしたときことは, なんらかの理由で「CからCへの代入オペレーター関数」が直接呼び出せなかったため「CからPへのキャストオペレーター関数」と「PからCへの代入オペレーター関数」を呼び出したということが想定されます.
ということはわかるんだけど, この質問文ではそれ以上のことが一切わかりません. 特に「『CからCへの代入オペレーター関数』を直接呼び出せない理由」がまったくわからないので, 「どうすればいいのか」には答えようがありません.
これらの関数の宣言と「CからCへの代入」で実際にやっていることがわかればまだ考えようもあるんだけど, ね.
確かに小さいテストプログラムを書いて見たところ、その通りでした。いま当該ソースコードがある場所に居らず確認ができないのですが、何処かに変数の型を間違える等のケアレスミスがある問題の気がしてきました。
ありがとうございます。
戻ったらソース確認して見ます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Borland C++ Compiler 5.5の警...
-
エラーの意味は? Lvalue req...
-
VBAでダブルコーテーション入り...
-
processing エラーで、 "cannot...
-
EXCEL/VBA 変数の値をクリップ...
-
python の 連鎖代入の文法
-
整数xxxが大き過ぎますというエ...
-
クラス中でコンストラクタを使...
-
プログラミングで変数と関数の...
-
Excel VBAでイコール二回使えま...
-
コマンド実行結果を変数に代入...
-
引数とは なんですか?
-
def partition(fn, ls): a, b =...
-
for the first timeとfirst tim...
-
フォームを開くときに、コンボ...
-
足して100になるような乱数のア...
-
C言語でCLAMP(a,b,c)
-
配列の値を置換するにはどうす...
-
C#の問題で2つの整数a,bの...
-
VBSで特定の文字列が含まれる場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでダブルコーテーション入り...
-
EXCEL/VBA 変数の値をクリップ...
-
エラーの意味は? Lvalue req...
-
jsp~jspにhiddenを使って変数...
-
Variant型で宣言してるのにEmpt...
-
[VBS]変数を定数に変換する方法...
-
テキストボックスの値を変数に...
-
processing エラーで、 "cannot...
-
整数xxxが大き過ぎますというエ...
-
【VBA】複合代入演算子
-
JavaScriptをURLから直接実行し...
-
VB6.0での条件文にある#の意味
-
だれがとけるの?
-
インクリメント演算子の前置(+...
-
プログラミングで変数と関数の...
-
datagridviewに行...
-
C言語 列挙型(enum型)変数について
-
verilog HDLの[=]と[<=]の使い分け
-
「%」を使って、偶数か奇数かを...
-
i++と++i ってどう違うのですか?
おすすめ情報
原因が判明しました。
C variable1; (実際にはメンバー変数)
variable1 = C(arg1,arg2,arg3);
のような代入を行っている箇所だったのですが、
ためしにポインタPからの代入オペレータをコメントアウトしたところ、
該当する代入オペレータがないというようなコンパイルエラーになりました。
C& operator=(C&) というようにconstをつけてませんでした。
これを
C& operator=(const C&)
と直したところ、コンパイルがとおり、
ポインタPからの代入オペレータのコメントアウトを元に戻して
実行しても問題はなくなりました。
ありがとうございました。