编译报错C2679:未找到接受Circle类型右操作数的<<运算符
解决C2679:二进制"<<"未找到接受Circle类型右操作数的运算符
嘿,我明白你碰到的问题了——你的代码里Circle结构体的write函数试图用os << *this输出对象,但编译器找不到对应的operator<<重载对吧?
问题根源
当编译器编译Circle结构体里的write成员函数时,后面定义的ostream& operator<<(ostream&, const Circle&)还没被它“看到”。C++编译器是按顺序处理代码的,在write函数内部尝试调用<<运算符时,它不知道后面还有这个重载函数,自然就会抛出C2679错误。
两种可行的修复方案
方案1:提前声明operator<<函数
我们可以先告诉编译器有这么一个运算符重载存在,再定义Circle结构体,这样编译器处理write函数时就知道该找什么了:
#include <iostream> using namespace std; // 提前声明Circle结构体和对应的operator<< struct Circle; ostream& operator<<(ostream& os, const Circle& rhs_c); struct Circle { void write(ostream& os) const { os << *this; } }; ostream& operator<<(ostream& os, const Circle& rhs_c) { os << "circle"; return os; } int main() { Circle c1; c1.write(cout); return 0; }
方案2:将operator<<作为友元函数嵌入Circle结构体
把运算符重载声明为Circle的友元,这样在结构体内部就能直接访问并使用它,不需要提前声明:
#include <iostream> using namespace std; struct Circle { // 声明友元运算符重载 friend ostream& operator<<(ostream& os, const Circle& rhs_c) { os << "circle"; return os; } void write(ostream& os) const { os << *this; } }; int main() { Circle c1; c1.write(cout); return 0; }
这两种方法都能解决你的编译错误,你可以根据自己的代码结构选择合适的方式~
内容的提问来源于stack exchange,提问作者Kabir
相关产品推荐
相关产品推荐

