不匹配调用 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;
}
我正在尝试通过重载 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;
}