我正在尝试重载运算符<<在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;
}
在运算符中使用transform&lt;&lt;抛出以下错误:
"error C2248:'std::basic_ios<_Elem,_Traits>::basic_ios':cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'"
答案 0 :(得分:1)
首先,如果你没有真正转变任何东西,请不要使用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::transform
与std::ostream_iterator
这样的代替:
std::transform(std::begin(mapItem.second), std::end(mapItem.second),
std::ostream_iterator<std::string>(ostrm),
[](const std::string* strPtr) { return *strPtr; });