gpt4 book ai didi

c++ - 使用 std::transform 打印 Map> 时出错

转载 作者:行者123 更新时间:2023-11-28 07:27:18 26 4
gpt4 key购买 nike

我正在尝试重载运算符<<以在 MapType 中打印 string* 的 vector (请参阅下面的 typedef),但不断出现错误。请帮忙。这是详细信息,我有以下类(class):

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。其次,您试图将输出流引用作为第三个参数传递,但它应该是一个迭代器。第三,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; });

关于c++ - 使用 std::transform 打印 Map<string, vector<string*>> 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com