曖昧なオーバーロードを解決するには?

解決


喜寿  2010-04-04 02:41:03  No: 71528

BCC5.5で書いていたライブラリをVC2008EEで使おうと思っているんですが
コードの中で曖昧なオーバーロードが解決できないというエラーが大量に出てしまいました。
例えば、あるクラスで
void hoge( const char* str );
void hoge( const void* ptr );
という関数が定義されていた時、引数に文字列リテラルを渡したら
どちらを呼ぶか決められないと怒られてしまったんです。他にも
Hoge( T* t );
bool operator==( T* t )const;
bool operator==( const Hoge& hoge )const;
という関数を持つクラスでHoge() == NULLという式でどちらの演算子を呼び出すか
決められないといわれてしまいました。
選ばれる関数によって大きく処理が違うので、ちゃんと呼び分けたいのですが
何分ソースが膨大なため、修正箇所ができるだけ少なくなる解決方法が知りたいです。
どなたかお知恵をお貸し願います。


tetrapod  2010-04-04 04:39:54  No: 71529

前者も後者も *単にそれだけなら* あいまいにならない。
発言で抜かした部分にあいまいさの原因があるよ。

判断材料が無いから妄想回答になるが explicit で解決すると思われる。


喜寿  2010-04-04 09:26:03  No: 71530

ご指摘ありがとうございます。
こちらでもしっかり検証すべきでした。tetrapod様の言うとおり上に示した例では全く問題なく通りました。
そこで、再現コードを作ろうと頑張ったのですが、全然うまくいかない・・・
かなりややこしいことしてる部分なので何がどう関係してるのか全く分かりません。
泣きそうです。

VCへの移植は少しずつ進めて最初1135個あったエラーもやっと225個になったんですが
全体的に無理な気がしてきました。BCCはテンプレートが弱い以外は使いやすいんですよね・・・。
何か進んだらまた来ます、。


tetrapod  2010-04-05 18:02:26  No: 71531

よくわからない曖昧さは、たいていの場合
・プログラマの気づかぬところで行われている暗黙変換
が原因だったりする。
例:
struct hoge {
    hoge(int);
};
struct piyo {
    piyo(int);
};

extern void func(hoge);
extern void func(piyo);

void xfunc() {
    func(0);
}
上記コードがなぜ曖昧になるのか、どう直せば曖昧でなくなるのか、
コンパイルせずに机上で理解してみるべし。

っていうか、コンパイルエラーメッセージをなぜそのまま提出しないの?
なぜきっちりエラーメッセージを全部読まないの?
gcc-4 も VS2005 もきっちり読めば自己解決できるほど詳しくエラー表示してるんだけど。
たぶん VS2008 も同じくらい詳しいエラー表示をするはず。

# そこまで苦労するのなら BCC のまま逝く、という選択肢はないの?


喜寿  2010-04-12 07:19:20  No: 71532

返信遅くなってしまいすみません。

色々すっとばしてお答えしますが、今はBCCでやってます。
が、少しずつVC対応もしています。
そこでわかったのですが、引数リストの中で暗黙の変換が2個以上発生する場合に最初のようなエラーが出るようです。

> っていうか、コンパイルエラーメッセージをなぜそのまま提出しないの?
> なぜきっちりエラーメッセージを全部読まないの?

完全にご指摘の通りです。テンプレート引数の表示までチェックしていませんでした。


喜寿  2010-04-18 11:14:32  No: 71533

関数の追加で解決しました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加