我写了一个矩阵类。我已经重载了operator +,以便用户可以编写:matrix + 2.我希望用户也写:2 +矩阵。如何在泛型类中使用朋友函数重载运算符?
对于标准格式(即对象调用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())中,我得到一些错误。
我一直有使用泛型类的朋友函数的问题,坦率地说,我从来没有明白为什么它从来没有为我工作。
有人能解释我在做什么错吗?
错误,我得到:
智能感知:无操作“+”匹配这些操作数的操作数类型是:INT +矩阵
严重性代码说明项目文件行错误C2244“矩阵::运算符+”:无法将函数定义与现有声明相匹配
@txtechhelp但朋友功能不是一个成员函数,所以它如何使用Matrix的范围解析运算符 –
误读代码/问题..道歉..我正在重新阅读关于朋友/模板的规范,因为您的问题是一个模板演绎错误(即编译器无法正确推断模板化的朋友函数)..将发布相关的答案/评论。 – txtechhelp
如果你的朋友函数是在Matrix类中声明的,你不能只需在类中进行以下操作:'朋友矩阵运算符+(const T&type,常量矩阵和矩阵){返回矩阵+类型; }'因为这是一个简单的操作,并且如果它在标题中,可能会打开一些优化内联。 – txtechhelp