【发布时间】:2021-08-23 05:01:19
【问题描述】:
我在全局命名空间中为time_point 声明了一个operator<< 重载,还在a 命名空间中为a::Foo 声明了一个重载。当我尝试在命名空间a 中定义的函数中打印time_point 时,出现错误:
二进制表达式的操作数无效。
为什么会这样,最好的解决方案是什么?
#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();
}
【问题讨论】:
-
因为Argument-dependent lookup。将重载放在
namespace std { /* operator overload */ }中使其工作,但老实说,我不知道这是否完全正确或一个好的解决方案。 -
定义一个新函数可能比为标准类型重载
<<运算符更好,一些未来的标准可能会声明自己的运算符,这可能与你的模棱两可 -
@churill 这是不允许的(请参阅17.6.4.2.1)。也不能保证标准库已经不提供这样的重载。在这种情况下,过载将变得模棱两可。整个想法一开始就不好。
-
如果你想给std添加一个可接受的函数,你必须创建自己的类(可以从标准类派生)
标签: c++ c++11 namespaces operator-overloading