尝试重载C++ <<运算符时出现编译错误,求问题原因
问题原因
- 你当前重载的
operator<<的第二个参数是内置类型int,C++标准库已经在std命名空间中提供了std::ostream& operator<<(std::ostream&, int)的标准实现,你在全局命名空间定义的同名函数会和标准库的实现产生调用二义性,编译器无法判断调用std::cout << 5时应该使用哪个版本,因此编译失败。 - C++标准明确规定,只有当运算符重载的参数中至少包含一个用户自定义类型时,才允许在全局命名空间定义重载,针对全部参数都是标准库类型/内置类型的运算符重载属于未定义行为,即使绕开二义性也不建议编写这类代码。
正确实现示例
如果需要重载<<输出自定义类型,可以参考如下合法写法:
#include <iostream> // 自定义类型 struct MyInt { int val; }; // 重载<<针对自定义类型MyInt,不会和标准库实现冲突 std::ostream& operator<<(std::ostream& os, const MyInt& n) { os << "自定义MyInt值:" << n.val; return os; } int main() { MyInt a{5}; std::cout << a << std::endl; // 正确调用自定义重载 std::cin.get(); return 0; }
内容的提问来源于stack exchange,提问作者TestUser
相关产品推荐
相关产品推荐

