使用 std::transform 打印映射<字符串、矢量<字符串*时出错> >

Error while using std::transform to print Map<string, vector<string*> >

本文关键字:gt 字符串 lt 出错 std 矢量 打印 使用 transform 映射      更新时间:2023-10-16

我正在尝试重载运算符<lt;在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;
}

在运算符<lt;引发以下错误:

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

首先,如果您没有真正转换任何内容,请不要使用std::transform。其次,您试图传递一个输出流引用作为第三个参数,但它应该是迭代器。第三,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; });