即使下面的映射重载了<<操作符,Feature.h也会被一个名为Session.C的类使用,并且我试图使用<<打印映射tKeyboard的值,这是一个非常奇怪的错误。我对这一切都很陌生,这是一个非常古老的代码,我对这个问题感到困惑,你们能提出一些建议吗?非常感谢谢谢。
Feature.h
class Feature {
..
public:
typedef map<string,KeyStroke,std::less<string>,std::allocator<std::pair<const string, KeyStroke> > > tKeyboard;
// It is a map of keys
// key is the name of the keystroke
typedef tKeyboard::const_iterator cKeysIter;
typedef tKeyboard::iterator KeysIter;
..
private:
friend ostream &operator<<(ostream &os,const tKeyboard &);
..
};Feature.C
ostream &operator<<(ostream &os,const Feature::tKeyboard &k)
{
os <<" Keyboard >\n";
for (Feature::cKeysIter i=k.begin() ; i!= k.end() ; i++)
{
os << "key name:"<<(*i).first << " ="<< (*i).second ;
}
return os;
}Session.C
if (keyStrokeVal.empty()){
Traced(3)<<"sendKey:Error, key "<<keyname<<" not defined or empty\n";
Traced(7)<<"Printing Feature "<<mCurrentFeature->get_mName() <<" 's keyboard \n" << mCurrentFeature->get_mKeyboard();
Traced(7)<<"\n";
return(-1);
}错误:
Session.C:541: error: no match for âoperator<<â in âstd::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)((std::basic_ostream<char, std::char_traits<char> >*)((std::ostream*)LogMgr::traceRovr())->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](std::endl [with _CharT = char, _Traits = std::char_traits<char>]))), ((const char*)"Session.C")))), ((const char*)" ")))->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](541))), ((const char*)" - ")))->std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](out_time))), ((const char*)"Printing Feature ")))), ((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::string*)((Session*)this)->Session::mCurrentFeature->Feature::get_mName()))))), ((const char*)" \'s keyboard \012")) << ((Session*)this)->Session::mCurrentFeature->Feature::get_mKeyboard()â
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:108: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:117: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:127: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:165: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:169: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:173: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream.tcc:91: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:180: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream.tcc:105: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:191: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:200: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:204: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:209: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:213: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:221: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ostream:225: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/ostream.tcc:119: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]发布于 2013-09-12 07:58:40
问题是,如果friend声明首先声明(但不定义)一个函数,则该函数的名称不会引入到周围的作用域中。引用C++11,namespace.memdef§3:
如果非本地类中的
friend声明首先声明一个类或函数,则朋友类或函数是最内部的封闭命名空间的成员。朋友的名字不是通过非限定查找(3.4.1)或限定查找(3.4.3)找到的,直到在该命名空间范围中提供匹配声明(无论是在授予友谊的类定义之前还是之后)。如果调用了一个朋友函数,则可以通过名称查找找到它的名称,该查找考虑来自名称空间和与函数参数类型相关的类的函数(3.4.2)。
(强调地雷)
因此,解决方案是一个单独的类外声明:
std::ostream &operator<<(std::ostream &os,const Feature::tKeyboard &);发布于 2013-09-12 07:39:05
一个可能的原因是没有找到您的::operator<<,因为没有搜索全局命名空间。并且不允许将operator<<添加到::std::中。如果是这样的话,可以使用本地using ::operator<<修复它。
发布于 2013-09-12 07:12:10
您是否尝试过将输出运算符添加到命名空间std以帮助ADL?
namespace std{
ostream &operator<<(ostream &os,const Feature::tKeyboard &k)
{
os <<" Keyboard >\n";
for (Feature::cKeysIter i=k.begin() ; i!= k.end() ; i++)
{
os << "key name:"<<(*i).first << " ="<< (*i).second ;
}
return os;
}
}https://stackoverflow.com/questions/18757641
复制相似问题