繁体   English   中英

使用std :: transform打印地图时出错 <string, vector<string*> &gt;

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

我正在尝试重载operator <<以在MapType中打印string *的向量(请参见下面的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 <<中使用transform会引发以下错误:

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

首先,如果您没有真正进行任何std::transform ,请不要使用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; });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM