2015-08-09 30 views
0

我写了一个矩阵类。我已经重载了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“矩阵::运算符+”:无法将函数定义与现有声明相匹配

+0

@txtechhelp但朋友功能不是一个成员函数,所以它如何使用Matrix的范围解析运算符

+0

误读代码/问题..道歉..我正在重新阅读关于朋友/模板的规范,因为您的问题是一个模板演绎错误(即编译器无法正确推断模板化的朋友函数)..将发布相关的答案/评论。 – txtechhelp

+0

如果你的朋友函数是在Matrix类中声明的,你不能只需在类中进行以下操作:'朋友矩阵运算符+(const T&type,常量矩阵和矩阵){返回矩阵+类型; }'因为这是一个简单的操作,并且如果它在标题中,可能会打开一些优化内联。 – txtechhelp

回答

1

看起来它只是一个模板演绎错误;也就是说,您的编译器无法根据模板化的朋友函数推导出正确的函数。由于你的朋友函数是一个简单的函数,所以你可以在你的类/头文件中声明它,编译器应该能够正确地推导出它(如果打开优化,也可能内联它)。只是声明友元函数在你的头就像这样:

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

你并不需要指定template关键字,因为这是你的模板专业类中。

希望能有所帮助。

+0

这可以解决问题。我仍然没有成功实现一个通用类中的朋友函数(在.cpp文件中实现)。好吧。 –

1

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

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

这绝对是正确的,但它没有解决我的问题。我还有:严重性\t代码\t说明\t项目\t文件\t行错误\t C2784 \t '的std :: _ Vb_iterator <_Alloc>的std ::运营商+(_的Alloc :: difference_type,性病:: _ Vb_iterator <_Alloc>)':不能推导出模板参数为'std :: _ Vb_iterator <_Alloc>'from'QS –

+0

@Ryan,这似乎是一个不同的问题。我猜测这跟调用的返回类型有关(*(this)(i,j)' –

+0

)它返回T&,这正是我想要的。 –