【问题标题】:How to overload an operator with a friend function in a generic class?如何在泛型类中使用友元函数重载运算符?
【发布时间】: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&amp; type, const Matrix&amp; matrix) { return matrix + type; },因为它是一个简单的操作并且可能内联了一些优化如果它在标题中.. ?
  • 哇!您极其简单的建议解决了问题以及大链或错误!如果您在下面发布您的答案,我将尽可能接受答案。
  • "possible" 优化(关键字可能,因为编译器可能决定不内联它并使其成为函数调用),但我相信 /O1/OI 会为内联可能性..并且您的 matrix.cpp 文件可以找到朋友功能,但是由于模板如何/为什么跨文件链接,您的 main.cpp 找不到正确的链接(这就是为什么将它推到标题中起作用的原因,因为它可以在所有访问它的文件中直接推断/链接,可以这么说)..

标签: c++ overloading operator-keyword friend


【解决方案1】:

看起来只是模板推演错误;也就是说你的编译器不能根据模板化友元函数推导出正确的函数。

由于你的朋友函数是一个简单的函数,你可以在你的类/头文件中声明它,编译器应该能够正确地推断出它(如果打开优化,也可能内联它);只需在标题中声明朋友函数,如下所示:

friend Matrix operator+(const T& type, const Matrix& matrix)
{
    return matrix + type;
}

您无需指定 template 关键字,因为它在您的模板专用类中。

希望能有所帮助。

【讨论】:

  • 这可以解决问题。我仍然从未在泛型类中成功实现友元函数(在 .cpp 文件中实现)。哦,好吧。
【解决方案2】:

您只需将成员函数更改为const即可解决此问题。

template<typename T>
Matrix<T> Matrix<T>::operator+(const T& rhs) const
{
   ...
}

【讨论】:

  • 这绝对是正确的,但它并没有解决我的问题。我仍然有:严重性代码描述项目文件行错误 C2784 'std::_Vb_iterator<_alloc> std::operator +(_Alloc::difference_type,std::_Vb_iterator<_alloc>)': 无法推断出 'std: 的模板参数: :_Vb_iterator<_alloc>' 来自 'QS
  • @Ryan,这似乎是一个不同的问题。我猜这与调用的返回类型有关 (*this)(i, j)
  • 它返回 T&,这正是我想要的。
  • 您也有const 版本吗?您需要一个非const 版本,以便可以将其用作左值。你需要一个const 版本,这样你就可以在this 上调用它。
  • @R Sahu 我都实现了。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2011-03-19
相关资源
最近更新 更多