1

operator<< をオーバーロードして string* のベクトルを MapType に出力しようとしています (以下の typedef を参照) が、エラーが発生し続けます。助けてください。詳細は次のとおりです。次のクラスがあります。

typedef map<string, vector<string*> > MapType;
class Thesaurus{
public: 
     ...
friend ostream& operator<<(ostream& ostrm, const Thesaurus& T);
private:
    MapType M;
    string DeRef(string* i);
    ...
};

どこ

ostream& operator<<(ostream& ostrm, const Thesaurus& T)
{
    for(MapType::const_iterator mItr = T.M.begin(); mItr!= T.M.end(); mItr++)
    {
        ostrm<< endl;   
        ostrm<< mItr->first<<"\t"; //print word
        transform(mItr->second.begin(), mItr->second.end(), ostrm, &Thesaurus::DeRef); // print synonyms vector
    }
    return ostrm;
}


string Thesaurus::DeRef(string* i)
{   
    return *i;
}

operator<< で変換を使用すると、次のエラーがスローされます。

"error C2248:'std::basic_ios<_Elem,_Traits>::basic_ios':cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'"
4

1 に答える 1

1

まず、std::transform実際に何も変換しない場合は使用しないでください。第 2 に、出力ストリーム参照を 3 番目の引数として渡そうとしていますが、それは反復子でなければなりません。第三に、Thesaurus::DeRefメソッドは静的ではないため、そのように関数に渡すことはできません。これらすべてにより、質問のエラーよりも多くのエラーが発生するはずです。

C++11 対応のコンパイラをお持ちの場合は、代わりに次のようなものをお勧めします。

ostream& operator<<(ostream& ostrm, const Thesaurus& T)
{
    for (const auto& mapItem : T.M)
    {
        ostrm << '\n';
        ostrm << mapItem.first << '\t';

        for (const auto& strPtr : mapItem.second)
            ostrm << *strPtr;
    }

    return ostrm;
}

内側のループの代わりに、次のように使用できます。std::transformstd::ostream_iterator

std::transform(std::begin(mapItem.second), std::end(mapItem.second),
               std::ostream_iterator<std::string>(ostrm),
               [](const std::string* strPtr) { return *strPtr; });
于 2013-08-30T13:16:00.957 に答える