1

私は次のように定義されたメンバー関数を持っています:

void printSomeData(std::ostream& str) const;

この方法で別のクラスからそのメンバーに電話をかけようとすると、次のようになります。

myclass.printSomeData(std::ofstream("foo.txt"));

次のエラーが発生します。

エラー:「myclass :: printSomeData(std :: ofstream)」の呼び出しに一致する関数がありません</ p>

注:引数1の'std :: ofstream {aka std::basic_ofstream}'から'std:: ostream&{aka std :: basic_ostream&}'への既知の変換はありません</ p>

ただし、以下のように最初にofstreamをインスタンス化する関数を呼び出すと、エラーは発生しません。これは実際には理解できません。

std::ofstream foo("foo.txt");
myclass.printSomeData(foo);

誰でも私に手がかりを与えることができますか?

ありがとうございました

4

3 に答える 3

3

ここで行っている非 const 参照に一時をバインドすることはできません。

myclass.printSomeData(std::ofstream("foo.txt"));
                            ^ temporary std::ostream object

代わりにこれを行うことができる場合:

std::ofstream os("foo.txt");
myclass.printSomeData(os);

std::ofstream一時オブジェクトではなく、既存のオブジェクトへの参照を渡しています。

printSomeData参照を取ることもできますconstが、おそらく関数内のストリームを変更したいでしょう。

于 2012-08-21T11:54:22.210 に答える
1
void printSomeData(const std::ostream& str) const;
//                   |
//              notice const

const一時オブジェクトは非参照にバインドできずstd::ofstream("foo.txt")、一時オブジェクトを作成します。

または、関数に非一時を提供できます。

于 2012-08-21T11:53:11.993 に答える
0
void printSomeData(std::ostream& str) const;

myclass.printSomeData(std::ofstream("foo.txt"));

一時オブジェクトを参照する関数に渡そうとします (つまり、 にバインドしようとしますrvalue) lvalue-reference。それは間違っています。使えますconst std::ostream&がダメです、std::ostream&&C++11が使えれば使えます。

void printSomeData(std::ostream&& str) const;
myclass.printSomeData(std::ofstream("foo.txt"));

ただし、この場合、ostream 型のオブジェクトを渡すことはできません。

于 2012-08-21T11:55:00.327 に答える