在我没有启动的项目上工作,我想在类中添加一个<<
运算符。问题:该类是另一类的私有内部类,后者在内namespace
。
而且我做不到。
可以通过以下方式简化问题:
#include <iostream>
#include <map>
namespace A {
class B {
private:
typedef std::map<int, int> C;
C a;
friend std::ostream& operator<<(std::ostream& os, const C &c) {
for (C::const_iterator p = c.begin(); p != c.end(); ++p)
os << (p->first) << "->" << (p->second) << " ";
return os;
}
public:
B() {
a[13] = 10;
std::cout << a << std::endl;
}
};
}
int main() {
A::B c;
}
我试图用编译g++ test.cpp
:error: no match for ‘operator<<’
。编译器找不到我的重载函数。我认为在标头中定义它会更简单,没有运气。如果您认为它更合适,我也可以在CPP文件中定义该类,但是我不知道该怎么做。
最后一个要求,我不能使用C ++ 11(不幸的是)。
由于Friend运算符首先在类内部声明,因此只能通过依赖于参数的查找来使用。但是,它的参数类型都不在中namespace A
,因此将找不到它。C
是的别名std::map
,因此被认为是namespace std
ADL的目的。
您可以通过多种方法来解决它,但没有一种是完美的:
namespace A
在类定义之前声明函数;那么它就可以通过常规查询使用,而不仅仅是ADL。但是,这在某种程度上破坏了封装,如果其他任何尝试使过载operator<<
,则可能会导致问题std::map
。C
为内部类,而不是的别名std::map
。这样可以在不破坏封装的情况下启用ADL,但是如果您希望它的行为像一样,则有点尴尬std::map
。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句