c++ - 为什么我的朋友函数在 C++ 中放入单独的源代码文件时不起作用?
问题描述
我有以下头文件:
TwoDimArray.h
class TwoDimArray {
int** data;
int rows, cols;
public:
TwoDimArray(int, int);
TwoDimArray(const TwoDimArray& orig);
virtual ~TwoDimArray();
const TwoDimArray& operator=(const TwoDimArray &op2);
void random();
TwoDimArray operator+(TwoDimArray &op2);
TwoDimArray operator+(const int &in);
TwoDimArray operator*(TwoDimArray &op2);
int* operator[](int i);
friend ostream& operator<<(ostream &os, TwoDimArray &twoDimArray);
};
我在我的 .cpp 文件中定义了朋友函数,如下所示:
TwoDimArray.cpp 片段
ostream& TwoDimArray::operator<<(ostream &os, TwoDimArray &twoDimArray)
{
for (int i = 0; i < twoDimArray.rows; i++)
{
os << "{";
for (int j = 0; j < twoDimArray.cols; j++)
{
os << twoDimArray.data[i][j];
if (j < twoDimArray.cols - 1)
{
os << ", ";
}
}
os << "}";
if (i < twoDimArray.rows - 1)
{
os << ", ";
}
}
os << endl;
return os;
}
出于某种原因,我收到以下错误消息:TwoDimArray.cpp:171:10: error: 'std::ostream& TwoDimArray::operator<<(std::ostream&, TwoDimArray&)' must have exactly one argument
经过一些研究,我发现一些人的答案不同,他们提到“this”是隐含的,以及你不能在类中定义友元函数的事实。
但这对我来说没有意义,因为最初只有一个带有 main 方法的 .cpp 文件和没有头文件的 TwoDimArray 类。并且朋友函数是在该类中定义的,并且没有这样的错误:
所以看起来可以在一个类中定义一个友元函数,但是当你在头文件中声明时会发生一些奇怪的事情。
解决方案
您对friend
函数的声明是正确的。但是在你的 .cpp 文件中,这个定义:
ostream& TwoDimArray::operator<<(ostream &os, TwoDimArray &twoDimArray) {
正在定义 的成员函数TwoDimArray
,这不是您在 .h 文件中声明的内容。(编译器错误消息告诉您这一点)。
相反,您需要像这样定义一个自由函数:
ostream& operator<<(ostream &os, TwoDimArray &twoDimArray) {
与声明相匹配friend
。
推荐阅读
- amazon-web-services - Terraform AWS Provider:SecretsManager 无法应用,因为版本已被删除
- reactjs - 如何对 reactjs 中组件的内联样式进行单元测试?
- c# - 更新在 ASP.NET MVC 中上传的 Excel 工作表
- join - 如何合并两个 Prometheus 查询的标签?
- express-handlebars - Express Handlebars 将页面内容附加到部分页面
- apache-spark - 搜索“正确大小写”并使用 Pyspark 将其标记为无效
- javascript - jQuery:仅在附件可用时显示按钮
- javascript - 有没有办法检查外部 JS 资源最后一次更新是什么时候?
- alexa - 如何从 Alexa 请求而不是意图名称中获取匹配的话语文本?
- java - 不断弹出 W/: Zip: Invalid filename in android studio