【发布时间】:2014-01-14 08:46:46
【问题描述】:
在一个我没有发起的项目上工作,我想在一个类中添加一个<< 运算符。问题:该类是另一个类的私有内部类,后者在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(很遗憾)。
【问题讨论】:
-
您的代码适用于 Visual C++ 编译器版本 15.0(即 VS2008,C++11 之前)。您使用的是哪个编译器?在 ideone.com 上不起作用....
-
我在那里看不到内部类。只是命名空间中的一个普通类。
-
@TonyD:好问题,我相应地更新了文本。我使用了普通的 g++:gcc 版本 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)。
-
ADL 可以通过这种方式找到
typedefs 吗?如果您用新的类定义替换typedef怎么办? (仅用于测试) -
@user980053:不,它不是内部类,它是
std::map的类型别名。所以ADL只考虑namespace std,并没有在namespace A中找到你的操作符。
标签: c++ operator-overloading header-files