我写了一个矩阵类。我重载了operator +,这样用户就可以写:matrix + 2.我希望用户也写:2 + matrix。
对于标准格式(即调用对象2),我编写了一个标准的运算符重载函数。它有效。
template<typename T>
Matrix<T> Matrix<T>::operator+(const T& rhs) const
{
Matrix result(rows, cols, 0.0);
for (unsigned i = 0; i < rows; ++i)
{
for (unsigned j = 0; j < cols; ++j)
{
result(i,j) = (*this)(i, j) + rhs;
}
}
return result;
}
现在换另一个顺序(即2 +矩阵),我写了好友函数:
// Friend Functions that allow the user to write expressions in a different order
template<typename T>
friend Matrix<T> operator+(const T& type, const Matrix<T>& matrix);
并实施为:
template<typename T>
Matrix<T> operator+(const T& type, const Matrix<T>& matrix)
{
return matrix + type;
}
当我尝试写2 +矩阵(在main()中)时,我遇到了一些错误。
我一直在使用普通类的朋友函数时遇到问题,坦率地说,我从来没有理解为什么它对我来说无效。
有人可以解释我在这里做错了吗?
我得到的错误:
智能感知:没有运营商&#34; +&#34;匹配这些操作数的操作数类型是:int + Matrix
严重级代码说明项目文件行错误C2244&#39; Matrix :: operator +&#39;:无法将函数定义与现有声明匹配
答案 0 :(得分:1)
您只需将成员函数更改为const
即可解决问题。
template<typename T>
Matrix<T> Matrix<T>::operator+(const T& rhs) const
{
...
}
答案 1 :(得分:1)
看起来它只是模板演绎错误;也就是说你的编译器无法根据模板化的友元函数推导出正确的函数。
由于你的朋友函数是一个简单的函数,你可以在你的类/头文件中声明它,编译器应该能够正确推导它(如果打开优化就可以内联它);只需在标题中声明友元函数,如下所示:
friend Matrix operator+(const T& type, const Matrix& matrix)
{
return matrix + type;
}
您不需要指定template
关键字,因为它在您的模板专用类中。
希望可以提供帮助。