- ベストアンサー
C++でのオーバーロードのバグ回避方法を知りたい
- C++でプログラムの途中で発生するオーバーロード関数のエラーについて調査しました。
- Visual C++のバージョン5.0で発生するバグであることが判明しましたが、回避方法は分かりません。
- 関係する部分のコードを抜粋しましたが、どのように対処すべきかわかりません。他のC++開発者はどのように対応しているのか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 回避方法って、要するに>>を使わなきゃいいんですよ。 その通り。 …で終るのも殺生なんで、代替案を。 1.getline(inputFunction, firstName) でfirstNameに一行読み込み、 lastName = firstName.substr(firstName.rfind(' ') + 1) firstName = firstName.substr(0, firstName.find(' ')) とかやって分ける。 でもなぁ。これもおなじバグが影響しそう。 特に、Q240/8/69.ASP のバグがほんとに影響してるなら、 多分、出ますね。 std/bastring.hの中で、operator>>(ifstream, string)と同じ ように、バリバリtemplateを使って宣言されてるんで。 2.char str[MAX_BYTES_PER_LINE+1]; inputFunction.getline(str, MAX_BYTES_PER_LINE); でstrに一行読み込み、 char fn[MAX_BYTES_PER_LINE+1], ln[MAX_BYTES_PER_LINE+1]; sscanf(str, "%s %s", fn, ln); で分ける。分け方は、strで初期化したstringオブジェクトをつくって、 1.と同様の方法で分けても良いです。Cの関数を使いたくないなら。 3.最初からストリームをCの標準入出力関数fopen(...)で開いて、 fscanfで読み込む。 *scanf(...)は、ifstream::operator>>(...)と同じくスペースを区切り記号 とみなすので、getline(...)のように分ける手間は省けます。 他にも色々あると思います。とにかく、やばいのは使わないことです。 私の周りにも、VC++経験者で(ちなみに私はGNU C++です) templateを極端に嫌う人がいます。(ちなみに私はこれでもかって位 使います。)
その他の回答 (1)
- KOH_da
- ベストアンサー率31% (161/506)
回避方法って、要するに>>を使わなきゃいいんですよ。
補足
確かに的を得た回答でしたが、Fookyさんのように詳しく書いて戴きたかったです。そもそも「>>を使わなきゃいい」と聞いて「ああ、なるほど」というレベルであれば質問はしていないと思います。仕事としてではなく、自発的に回答して下さっているのですから、1から10まですべて教えて欲しいとは言いませんが、もう少し説明して下さっても罰は当たらないと思います。その分、質問者は回答者に感謝の言葉を返しているのです。今回は残念ですがKOH_daさんに対して感謝の言葉を述べることはできません。しかし、理由は理解していただけると思っています。次回からはよろしくお願いします。
お礼
>>を使わない、というのはそういう意味だったのですね。 1.getline(inputFunction, firstName)が見事成功しました。 firstNameの名前をfullNameに変えてクラスのメンバーに入れましたが その他はFookyさんの回答をコピーしただけです。 2.と3.はまだ試してません。今度やってみます (というか、もう動いたのでいいのですが)。 オーバーロードというのが何なのかさえ判らないというのもあるのですが、 あいまいです、ってぶっきらぼうに言われても困りますよね。 だからバグなんでしょうけど。 そういうエラーメッセージの方がよっぽどあいまいだと思うのですが。 とにかく、この問題が発生する度に毎回これを使えばいいのですね。 本当に助かりました。ありがとうございました。