【发布时间】:2016-03-19 16:17:22
【问题描述】:
当试图掌握 std::ostream_iterator 时,我想出了以下无法编译的代码(在 gcc 5.3 或 clang 3.6 下)。
#include <iostream>
#include <iterator>
namespace temp {
struct Point {
int x;
};
}
//namespace temp {
//namespace std {
std::ostream& operator<<(std::ostream& s, temp::Point p) {
return s << p.x;
}
//}
int main(int argc, char** argv) {
temp::Point p{1};
std::ostream_iterator{std::cout} = p;
//std::cout << p;
std::cout << std::endl;
return 0;
}
当operator<< 在全局范围内时,编译会引发大量模板实例化错误。
但是,std::cout << p 工作正常。而且,如果在namespace temp 或namespace std 中声明operator<<,则代码会按预期编译和运行。
我的问题是为什么全局 operator<< 不起作用?
【问题讨论】:
标签: c++ c++11 operator-overloading