重载插入/提取运算符报错:无法匹配overloaded-function类型操作数
你的C++重载运算符报错原因及修复方案
首先直接点出核心问题:你遇到的错误根源是**TestMatrix mMatrix2();这行代码被编译器解析成了函数声明,而不是你想要的无参对象实例化**——这是C++里著名的「最令人头疼的解析(Most Vexing Parse)」规则导致的。
为什么会被解析成函数?
C++编译器的语法解析规则里,当遇到形如Type identifier();的代码时,会优先将其解释为:
声明一个名为
identifier的函数,该函数不接受任何参数,返回值类型为Type
所以你的mMatrix2在这里是一个函数的名字,而非TestMatrix类的对象。当你尝试执行cin >> mMatrix2时,编译器找不到能接受函数作为右操作数的>>重载,自然就抛出了你看到的错误。
怎么修复这个问题?
要正确创建无参的TestMatrix对象,你有两种写法可选:
- 去掉括号:
TestMatrix mMatrix2; - 使用C++11及以后支持的统一初始化语法:
TestMatrix mMatrix2{};
你的代码里还有其他需要修正的问题
除了上面的核心错误,你的代码还有构造函数冲突的问题:
你在类内部已经定义了带默认参数的构造函数:
TestMatrix(int row=1, int col=1):row(row), col(col){ arr = new int*[row]; for (int i = 0; i<row; i++) { arr[i] = new int[col]; } }
这个构造函数本身就支持无参调用(因为参数都有默认值),但你又在类外额外定义了一个无参构造函数TestMatrix() {...},这会导致编译器在处理无参对象创建时产生歧义,不知道该调用哪个构造函数,必须删掉这个类外的无参构造。
另外,你的类使用了动态分配的内存(new创建的二维数组),但没有定义析构函数来释放内存,这会导致内存泄漏。建议添加析构函数:
~TestMatrix() { for (int i = 0; i < row; i++) { delete[] arr[i]; } delete[] arr; }
修复后的完整代码示例
#include <iostream> using namespace std; class TestMatrix { int row, col; int **arr = NULL; public: friend istream& operator>> (istream &in, TestMatrix &mat); friend ostream& operator<< (ostream &out, TestMatrix &mat); // 带默认参数的构造函数,支持无参调用 TestMatrix(int row=1, int col=1):row(row), col(col){ arr = new int*[row]; for (int i = 0; i<row; i++) { arr[i] = new int[col]; } } // 添加析构函数释放内存 ~TestMatrix() { for (int i = 0; i < row; i++) { delete[] arr[i]; } delete[] arr; } }; istream & operator>> (istream & in, TestMatrix &mat) { cout << "Enter " << mat.row * mat.col << " numbers row wise \n"; for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { in >> mat.arr[i][j]; } } return in; } ostream & operator<< (ostream & out, TestMatrix &mat) { for (int i = 0; i < mat.row; i++) { for (int j = 0; j < mat.col; j++) { out << mat.arr[i][j] << " "; } out << "\n"; } return out; } int main() { TestMatrix mMatrix1(3, 3); // 正确创建无参对象,二选一即可 TestMatrix mMatrix2; // TestMatrix mMatrix2{}; cin >> mMatrix1; cin >> mMatrix2; // 测试输出 cout << "\nMatrix 1:\n" << mMatrix1; cout << "\nMatrix 2:\n" << mMatrix2; return 0; }
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

