【发布时间】:2015-11-01 06:00:06
【问题描述】:
我写了一个矩阵类。我重载了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() 中),我得到了一些错误。
我一直在使用泛型类的友元函数时遇到问题,坦率地说,我一直不明白为什么它对我不起作用。
有人可以解释一下我在这里做错了什么吗?
我得到的错误:
IntelliSense:没有运算符“+”匹配这些操作数操作数类型是:int + Matrix
严重性代码描述项目文件行错误 C2244 'Matrix::operator +': 无法将函数定义与现有声明匹配
【问题讨论】:
-
@txtechhelp 但是友元函数不是成员函数,怎么使用Matrix的作用域解析算子
-
误读代码/问题 .. 道歉 .. 我正在重新阅读有关朋友/模板的规范,因为您的问题是模板推断错误(即编译器无法正确推断模板化朋友函数) ..将发布相关的答案/评论..
-
如果你的朋友函数是在
Matrix类中声明的,你就不能在类中做以下事情吗:friend Matrix operator+(const T& type, const Matrix& matrix) { return matrix + type; },因为它是一个简单的操作并且可能内联了一些优化如果它在标题中.. ? -
哇!您极其简单的建议解决了问题以及大链或错误!如果您在下面发布您的答案,我将尽可能接受答案。
-
"possible" 优化(关键字可能,因为编译器可能决定不内联它并使其成为函数调用),但我相信
/O1或/OI会为内联可能性..并且您的 matrix.cpp 文件可以找到朋友功能,但是由于模板如何/为什么跨文件链接,您的 main.cpp 找不到正确的链接(这就是为什么将它推到标题中起作用的原因,因为它可以在所有访问它的文件中直接推断/链接,可以这么说)..
标签: c++ overloading operator-keyword friend