operator>>()で「あいまいである」とエラーが出るのですが・・・

[戻る]
シュータロー 2005/07/26(火) 22:49:38
シュータローと申します。初心者ですが、よろしくお願いします。

試験的に蔵書管理プログラムを作っているのですが、蔵書の名前などをoperator>>()
でオブジェクトに一括して代入しようとしましたが「あいまいである」とエラーが出て
コンパイルが通りませんでした。原因がどこにあるのかわからず困っています。
プログラムを載せてみますが、どこまで載せたらよいのかわからないのでoperator>>()
の実装と呼び出しだけ載せます。
class bookData{
      ・
      ・
      ・
public:
      ・
      ・
      ・
 friend istream& operator >> (istream& ist, bookData& bookdata);
};

istream& operator >> (istream& ist, bookData& bookdata){
 cout << "input data: " << endl;
 cout << "\n" << "the book name -- "
    << "\n" << "the book auther name -- "
    << "\n" << "the book's publisher -- "
    << "\n" << "note a line -- ";

 return ist >> bookdata.bookName
       >> bookdata.autherName
       >> bookdata.publisher
       >> bookdata.note;
}
      ・
      ・
      ・

bookData registrateData;
cin >> registrateData;

どうかよろしくお願いします。

RAPT 2005/07/26(火) 23:25:05
開発環境(コンパイラ・OSなどの名称とバージョン)を明記の上、
エラーメッセージを自分で勝手に解釈せず、そのまま(できればコピー&ペーストして)
掲載してください。

それから、コンパイルエラーの発生している行を明示してください。

bookData クラスの定義も要確認。

シュータロー 2005/07/27(水) 18:22:16
開発環境は、
VC++ 6
WindowsXP pro sp1

エラーメッセージは、
 error C2593: 'operator >>' があいまいです。

cin >> registrateData; でのエラーです
bookDataのメンバ変数
 bookName
 autherName
 publisher
 note
はいずれもstring型です。

シュータロー 2005/07/27(水) 18:27:24
すいません、全部載せるの忘れてました・・・。

error C2248: 'bookName' : private メンバ (クラス 'bookData' で宣言されている)にアクセス
できません。
'bookName' の宣言を確認してください。
error C2248: 'autherName' : private メンバ (クラス 'bookData' で宣言されている)にアク
セスできません。
'autherName' の宣言を確認してください。
error C2248: 'publisher' : private メンバ (クラス 'bookData' で宣言されている)にアクセ
スできません。
'publisher' の宣言を確認してください。
error C2248: 'note' : private メンバ (クラス 'bookData' で宣言されている)にアクセスでき
ません。
'note' の宣言を確認してください。
error C2593: 'operator >>' があいまいです。

エラーは以上です。

RAPT 2005/07/27(水) 23:07:14
デバッグの基本は、「Error/Warningは上から順番に対処する」です。
多くの場合、エラー等は、最初のエラーが引き金になって、
順番にエラー/警告になる事が多いです。

最初のエラーから順に対処することをお奨めします。
エラーコードについてはMSDNを参照すること。

MSDN> コンパイラ エラー C2248
MSDN> 'member' : 'access' 'member' (クラス 'class' で宣言されている) にアクセスで
きません。
MSDN> クラス、構造体、共用体のプライベートな、あるいはプロテクトのメンバにアクセスし
ました。

MSDN> コンパイラ エラー C2593
MSDN> 演算子 'identifier' があいまいです。
MSDN> 指定されたオーバーロード演算子には、可能な演算子が 2 つ以上定義されています。
MSDN> 実引数のうちのいくつかを明示的にキャストすれば、あいまいさは解決できます。


Windows2000sp4/VC++6.0sp6/非MFC でテストコードを書きましたが、
再現しませんでした。再度、あなたのコードを見直してみてください。
おそらく、bookData は別の operator も定義しているのではないでしょうか。

#include <stdafx.h>
#include <iostream>
#include <string>

using namespace std;

class bookData
{
    string bookName;
    string autherName;
    string publisher;
    string note;
public:
    void put_data()
    {
        cout << "bookName: " << bookName << "\n"
            << "autherName: " << autherName << "\n"
            << "publisher: " << publisher << "\n"
            << "note: " << note << endl;
    }
    friend istream& operator >> (istream& ist, bookData& bookdata);
};

istream& operator >> (istream& ist, bookData& bookdata)
{
    cout << "input data: " << endl;
    cout << "\n" << "the book name -- "
         << "\n" << "the book auther name -- "
         << "\n" << "the book's publisher -- "
         << "\n" << "note a line -- ";

    return ist>> bookdata.bookName
         >> bookdata.autherName
         >> bookdata.publisher
         >> bookdata.note;
}

int main()
{
    bookData registrateData;
    cin >> registrateData;
    registrateData.put_data();
    getchar();
    return 0;
}

シュータロー 2005/07/28(木) 21:02:07
お返事ありがとうございます。
載せていただいたソースをコンパイルしたところ、再度同様のエラーメッセージが出ま
した…。
この場合はどこがいけなかったのでしょう…?

シュータロー 2005/07/28(木) 22:16:24
[[解決]]
PARTさんいろいろとありがとうございました。
operator >> ()を宣言しているクラス定義の前に、この演算子関数をプロトタイプ宣言
してみたのですが、コンパイルが通りました。
ただ理由が今ひとつわかっていないのですが…。メンバ関数でいままでプロトタイプ宣
言したことなかったのですが…フレンド関数に関してはプロトタイプ宣言する必要があ
るという解釈で良いのでしょうか。

RAPT 2005/07/29(金) 00:25:57
bookDataクラスの定義前に
istream& operator >> (istream& ist, bookData& bookdata)
を定義?

1.bookDataクラスの宣言
2.istream& operator >> (istream& ist, bookData& bookdata) の定義
3.bookDataクラスの定義
4.main関数の定義
ってことでしょうか。これだとコンパイルエラーになるはず…。(ってか、なった。)

いまいち状況がつかめませんが、こちらの環境では、単一のxxxx.cppに上記のソースを
まるっと書いてコンパイルするだけですが、エラーにはなりませんでした。

※テスト用プロジェクト(cpptest)の構成は、下記のとおり。
ソースはすべて、cpptest.cpp に記述。
cpptest.cpp
StdAfx.cpp
StdAfx.h

シュータロー 2005/07/29(金) 00:51:11
class bookData;  //クラスの先行宣言
istream& operator>>(istream& ist, bookData& bookdata);  //プロトタイプ宣言
class bookData{...};   //クラス定義
istream& operator>>(istream& ist, bookData& bookdata){...}; //フレンド関数定義
main関数

の順番で通りました。

Kazuki 2005/08/01(月) 07:16:13
VC++6のSPがあたってないものを使ってるとか?

古いスレッドには追加発言できません。