如何在泛型类中使用友元函数重载运算符?

时间:2015-08-09 03:34:52

标签: c++ overloading operator-keyword friend

我写了一个矩阵类。我重载了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;:无法将函数定义与现有声明匹配

2 个答案:

答案 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关键字,因为它在您的模板专用类中。

希望可以提供帮助。