C++自定义类重载<<运算符非友元写法调用失效原因咨询
核心原因
这个问题本质是C++二元运算符重载的固定规则导致的:
当你将二元运算符重载为类的成员函数时,运算符的左操作数必须是当前类的实例,编译器会默认把左操作数作为调用成员函数的this对象,右操作数作为成员函数的入参。
你写的成员函数版operator<<就踩了这个规则的坑:
- 你声明的成员函数
std::ostream& operator<<(std::ostream& ost);,要求调用时左操作数是Vector3对象,右操作数是std::ostream对象,所以只有u << std::cout或者u.operator<<(std::cout)的写法符合参数顺序,能正常调用。 - 而你期望的
std::cout << u写法,左操作数是std::ostream类型,右操作数是Vector3类型,和成员函数要求的参数顺序完全相反,编译器自然找不到匹配的运算符实现,就会报匹配失败的错误。
补充说明
所有左操作数不属于当前类的二元运算符(比如流插入<<、流提取>>,或是需要支持1 + 自定义类实例这类基础类型在左的运算场景),都必须重载为全局友元函数,不能作为类成员函数实现,就是为了匹配运算符调用时的参数顺序。
内容的提问来源于stack exchange,提问作者tommyd
相关产品推荐
相关产品推荐

