首页 > 解决方案 > 为什么找不到 operator<< 重载?

问题描述

我已经在全局命名空间中声明了一个operator<<重载 for ,也在命名空间中声明了一个 for 。当我尝试在也定义在 namespace 中的函数中打印 a 时,出现错误:time_pointa::Fooatime_pointa

二进制表达式的操作数无效。

为什么会这样,最好的解决方案是什么?

#include <iostream>
#include <chrono>

std::ostream &operator<<(std::ostream &os,
                         const std::chrono::system_clock::time_point &time_point);
namespace a {
class Foo;
std::ostream &operator<<(std::ostream &os, const a::Foo &foo);
void print_time() {
  std::cout << std::chrono::system_clock::now(); // error here!
}
}

int main() {
  a::print_time();
}

标签: c++c++11namespacesoperator-overloading

解决方案


原因很简单:a::operator<< 因为::operator<<它们具有相同的名称,所以会影响您。这就是为什么操作员基本上必须与他们的类共享一个命名空间:这种阴影是可以预料的,因此ADL(如评论中所讨论的)是找到它们的唯一可靠方法。


推荐阅读