-PR-
解決済み

C++でオーバーロードに関するバグの回避

  • すぐに回答を!
  • 質問No.96338
  • 閲覧数988
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 88% (134/152)

プログラムの途中で次のエラーが出ました。

error C2667: '>>' : 2個のオーバーロード関数があいまいで最適な変換ができません。
error C2593: 'operator >>' があいまいです。

調べましたらVisual C++自体のバグらしいのです。

http://support.microsoft.com/support/kb/articles/Q240/8/69.ASP
http://support.microsoft.com/support/kb/articles/Q128/3/44.ASP

僕のVisual C++はVersion 5.0です。
学校のはVersion 6.0ですのでこのバグは出ません。

このバグを回避する方法は無いのでしょうか?
Version 5.0を使用されている方は結構いらっしゃるのではないかと
思うのですが、皆さんはどうされているのでしょうか?

一応、関係ありそうなところだけ抜粋しました。

■main.cpp
shareholder total[size];// 全員の名前が入る予定のtotal[]を
// class "shareholder"で定義

total[s].getData(input);// 関数getData()を呼ぶ
// inputはifstreamで定義されている

■shareholder.h
class shareholder
{
public:

shareholder();
virtual ~shareholder();

void getData(ifstream&);

private:

string firstName;
string lastName;
};

■shareholder.cpp
void shareholder::getData(ifstream& inputFunction)
{
inputFunction >> firstName >> lastName;// ここでエラーが発生
}
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル9

ベストアンサー率 71% (59/82)

> 回避方法って、要するに>>を使わなきゃいいんですよ。

その通り。

…で終るのも殺生なんで、代替案を。

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を極端に嫌う人がいます。(ちなみに私はこれでもかって位
使います。)
お礼コメント
sucker

お礼率 88% (134/152)

>>を使わない、というのはそういう意味だったのですね。

1.getline(inputFunction, firstName)が見事成功しました。
firstNameの名前をfullNameに変えてクラスのメンバーに入れましたが
その他はFookyさんの回答をコピーしただけです。

2.と3.はまだ試してません。今度やってみます
(というか、もう動いたのでいいのですが)。

オーバーロードというのが何なのかさえ判らないというのもあるのですが、
あいまいです、ってぶっきらぼうに言われても困りますよね。
だからバグなんでしょうけど。
そういうエラーメッセージの方がよっぽどあいまいだと思うのですが。

とにかく、この問題が発生する度に毎回これを使えばいいのですね。
本当に助かりました。ありがとうございました。
投稿日時 - 2001-06-29 11:45:47
関連するQ&A
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 31% (161/506)

回避方法って、要するに>>を使わなきゃいいんですよ。 ...続きを読む
回避方法って、要するに>>を使わなきゃいいんですよ。
補足コメント
sucker

お礼率 88% (134/152)

確かに的を得た回答でしたが、Fookyさんのように詳しく書いて戴きたかったです。そもそも「>>を使わなきゃいい」と聞いて「ああ、なるほど」というレベルであれば質問はしていないと思います。仕事としてではなく、自発的に回答して下さっているのですから、1から10まですべて教えて欲しいとは言いませんが、もう少し説明して下さっても罰は当たらないと思います。その分、質問者は回答者に感謝の言葉を返しているのです。今回は残念ですがKOH_daさんに対して感謝の言葉を述べることはできません。しかし、理由は理解していただけると思っています。次回からはよろしくお願いします。
投稿日時 - 2001-06-29 11:49:28


このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ