2016-12-29 54 views
0
#include<fstream> 
#include<string> 
#include<memory> 
class Log 
{ 
private: 
    string errorlog; 
    shared_ptr<ofstream> fs; 
public: 
    Log() :errorlog(""), fs(new ofstream("c:\\Log\\log.txt"), [](ofstream& fs) {fs.close(); }) 
    { 

    } 
    void transferLog(string errorlog) 
    { 
     (*fs)<<(errorlog) //is working 
     fs->operator<<(errorlog); //not working 

    } 
} 

私はそれが動作すれば、他の一般的な状況でうまく動作することを知っています。ostream :: operator <<はshared_ptrのoperator->で動作しません

は、このエラーリスト

no instance of overloaded function "std::basic_ofstream<_Elem, _Traits>::operator<< [with _Elem=char, _Traits=std::char_traits<char>]" matches the argument list 

答えて

3

まあ、その後それをしないでください。

オーバーロードされたoperator<<は、2つの方法のいずれかで定義できます。それはfs->operator<<(errorlog);と呼ばれるメンバ関数として定義することも、operator<<(*fs, errorlog);と呼ばれる自立関数として定義することもできます。

標準出力ストリームの場合、一部のオーバーロードは最初の形式を使用し、その他の形式は2番目の形式を使用します。あなたが間違ったフォームを選んだら、物事が壊れます。あなたがどちらかを使う必要がある非常に特定のユースケースがない限り、両方のフォームを考慮して両方のセットから最良のオーバーロードを選ぶ*fs << errorlog;:と書いてください。

関連する問題