如果在命名空间中定义,为什么找不到 operator<<?

Why is operator<< not found if defined in namespace?

提问人: 提问时间:4/9/2021 更新时间:4/9/2021 访问量:77

问:

在下面的代码中,我在尝试打印到控制台时遇到错误。如果我搬到外面,它就会消失。为什么会这样?我必须在全局命名空间中定义我的函数吗?time_pointoperator<<my_namespaceoperator<<

#include <iostream>
#include <chrono>
#include <date/date.h>

namespace my_namespace {

std::ostream &operator<<(std::ostream &os,
                         const std::chrono::system_clock::time_point &time_point) {
  return os << date::format(
      "%F %T\n",
      std::chrono::time_point_cast<std::chrono::milliseconds>(time_point));
}

}

int main() {

  std::chrono::system_clock::time_point time_point{
      std::chrono::milliseconds{1000}};
  std::cout << time_point;

}
C++ C++11 命名空间 算符重载 IOSTREAM

评论

1赞 super 4/9/2021
非限定名称查找仅搜索当前命名空间和封闭命名空间(包括全局作用域)之外的命名空间。由于这两个参数都来自命名空间,因此您也不会从 ADL 获得任何帮助。std
2赞 StoryTeller - Unslander Monica 4/9/2021
这不是一个答案,只是一个框架挑战。如果名称查找总能找到事物,而不管它们在哪个命名空间中声明,那么如何避免冲突呢?为什么要在这样的系统中使用命名空间?
0赞 super 4/9/2021
下面是有关非限定名称查找的一些详细信息。
0赞 4/9/2021
谢谢大家。我会阅读不合格的名称查找。那么,定义一个允许将时间点写入流的重载,是在全局命名空间中定义它的唯一方法吗?operator<<
0赞 0xNIC 4/9/2021
你试过吗?std::cout << (my_namespace::operator<< time_point) << std::endl;

答: 暂无答案