首页 > 解决方案 > 为什么我的朋友函数在 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 类。并且朋友函数是在该类中定义的,并且没有这样的错误:

在此处输入图像描述

所以看起来可以在一个类中定义一个友元函数,但是当你在头文件中声明时会发生一些奇怪的事情。

标签: c++friend

解决方案


您对friend函数的声明是正确的。但是在你的 .cpp 文件中,这个定义:

ostream& TwoDimArray::operator<<(ostream &os, TwoDimArray &twoDimArray) {

正在定义 的成员函数TwoDimArray,这不是您在 .h 文件中声明的内容。(编译器错误消息告诉您这一点)。

相反,您需要像这样定义一个自由函数:

ostream& operator<<(ostream &os, TwoDimArray &twoDimArray) {

与声明相匹配friend


推荐阅读