c++ - 为什么找不到 operator<< 重载?
问题描述
我已经在全局命名空间中声明了一个operator<<
重载 for ,也在命名空间中声明了一个 for 。当我尝试在也定义在 namespace 中的函数中打印 a 时,出现错误:time_point
a::Foo
a
time_point
a
二进制表达式的操作数无效。
为什么会这样,最好的解决方案是什么?
#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();
}
解决方案
原因很简单:a::operator<<
因为::operator<<
它们具有相同的名称,所以会影响您。这就是为什么操作员基本上必须与他们的类共享一个命名空间:这种阴影是可以预料的,因此ADL(如评论中所讨论的)是找到它们的唯一可靠方法。
推荐阅读
- vba - 如何在 Visual Basic 中查找单词片段
- ssis - BIML -> 使用现有包并添加数据流
- javascript - 收到的请求总是空的
- ruby-on-rails - Puma 无法在 AWS Elastic Beanstalk 上的 Rails 5 上运行
- docker - 如何为 minikube 内的 pod 配置内部静态 ip
- angularjs - 如何将 ng-options comprehension_expression 传递给 AngularJS 组件?
- statistics - OLS 回归的问题 - 高度相似的 X 和截距系数
- apostrophe-cms - 如何在 ApostropheCMS 中设置网站图标
- scala - 查找在给定月份中花费最大金额的客户 ID
- python - 如何解密我知道它在 Python 中的模式的字符串?