不匹配调用 operator<< 重载的模板成员函数

No match to call for template member function for operator<< overload

我正在尝试通过重载 operator<< 重载来为矩阵 class 编写输出函数。矩阵 class 也有一个索引函数,它是通过重载 `op.

创建的

代码如下:

template<typename T, unsigned int N>
T& LU_Matrix<T, N>::operator() (unsigned int i, unsigned int j)
{
    return data_[N * i + j];
}

template<typename T, unsigned int N>
std::ostream& operator<< (std::ostream& os, const LU_Matrix<T, N> mat)
{
    for (unsigned int i = 0; i < N; ++i)
    {
        for (unsigned int j = 0; j < N; ++j)
        {
            os << mat(i, j) << " ";
        }
        os << std::endl;
    }
    return os;
}

int main()
{
    LU_Matrix<double, 3> lu_mat();
    // instantiate lu_mat here
    std::cout << lu_mat << std::endl;
    return 0;
}

当我运行这个时,它抛出错误

no match to call for '(const LU_Matrix<double, 3>) (unsigned int, unsigned int)'

鉴于模板函数重载 operator<<,编译器似乎应该已经创建了声明的函数。这里出了什么问题?

What's going wrong here?

正如其他人在评论部分指出的那样,您的 LU_Matrix::operator() isn't const-qualified,因此它不能与 const 合格的 LU_Matrix 对象一起使用。

在您的 operator<< 重载中,您遇到了上述情况:

std::ostream& operator<< (std::ostream& os, const LU_Matrix<T, N> mat)
//                                          ^^^^^^ --------------------> this

此处编译器未找到 const operator() 运算符重载以调用 const 对象,因此出现错误!

您需要将声明和定义更改为:

const T& operator() (unsigned int i, unsigned int j) const;
^^^^^^^^^                                            ^^^^^^

不是这样,return 参数也必须是 const 合格的,因为您 return 来自 const 成员函数的 class 成员的元素。


此外,作为改进operator<<,既不修改对象也不 需要一份副本,因此您实际上可以将 const-ref 传递给 LU_Matrix<T, N> 传递给 operator<< 重载:

template<typename T, unsigned int N>
std::ostream& operator<< (std::ostream& os, const LU_Matrix<T, N>& mat) /* noexcept */
{
    // ...
    return os;
}

(See a demo)