2013-08-30 55 views
0

错误我想超载运算符< <打印在MapType中的字符串*的向量(请参阅下面的typedef),但不断收到错误。请帮忙。下面是详细信息,我有下面的类:使用std :: transform打印地图<字符串,向量<string*>>

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; 
} 

使用在运营商< <变换引发以下错误:

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

您正尝试传递一个流进行转换。它期望一个迭代器。 – jrok

回答

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::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; }); 
+0

我使用的是C++ 98,请给我一些关于C++旧版本的提示。 – user2696565

+0

@InnocentRetard然后让'DeRef'函数'static',并且使用我的'std :: transform'调用的变体,但是使用* static *函数而不是lambda。 –

+0

工作得很好。谢谢。当DeRef函数不是静态的时候,在我的代码的不同位置,我必须使用这个:bind1st(mem_fun(&Thesaurus :: DeRef),this)。现在由于DeRef是静态的,我可以使用&Thesaurus :: DeRef!再一次感谢你。 – user2696565

相关问题