在两个子类中使用Base Multiplication Operator

时间:2018-03-08 20:56:09

标签: c++ inheritance operators

我试图编写一个简单的Matrix / Point类库,并且我希望使用基类乘法运算符重载来乘以两个继承的类。

编辑2 代码恢复原状,为未来的旅行者:

#include <array>
#include <tuple>
#include <vector>


template <typename DataType, unsigned short NumberOfRows, unsigned short NumberOfColumns>
class GenericMatrix
{
public:

    GenericMatrix operator * (GenericMatrix const & rightHandSide)
    {
        //DO MATRIX MULTIPLICATION
        return GenericMatrix<DataType, NumberOfRows, NumberOfColumns>();
    }   
};


template <typename DataType>
class RotationMatrix2D : public GenericMatrix<DataType, 2, 2>
{   
};

template <typename DataType>
class Point2D : public GenericMatrix<DataType, 1, 2>
{    
};

int main()
{
    RotationMatrix2D<double> rotMatrix;
    Point2D<double> point;

    point * rotMatrix; //Error here

    return 0;
}

这允许我使用点基本上只是一个矩阵的事实。但是,我一直遇到编译错误:

  

错误C2679二进制&#39; *&#39;:找不到右侧的操作符   类型&#39; RotationMatrix2D&#39;的操作数(或者没有可接受的   转化率)

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的问题源于您的运算符是针对特定GenericMatrix模板实例的事实。要了解发生了什么,您可以扩展Point2D继承的运算符,如下所示:

GenericMatrix<double, 1, 2> 
GenericMatrix<double, 1, 2>::operator*(const GenericMatrix<double, 1, 2>& rhs)

现在,RotationMatrix2D<double>GenericMatrix<double, 2, 2>不适合作为rightHandSide的参数,GenericMatrix<double, 1, 2>GenericMatrix<double, 2, 2>是不同的不相关类型。

你可以通过将运算符编写为模板化函数来解决这个问题,这样模板就可以适应不同的rhs类型,即

GenericMatrix<double, 1, 2>::operator*(const GenericMatrix<double, 2, 2>& rhs)

以下似乎按预期工作:

#include <array>
#include <tuple>
#include <vector>


template <typename DataType, int NumberOfRows, int NumberOfColumns>
class GenericMatrix
{
public:
    template<int N, int M>
    GenericMatrix operator * (const GenericMatrix<DataType, N, M> & rightHandSide)
    {
        //DO MATRIX MULTIPLICATION
        return GenericMatrix<DataType, NumberOfRows, NumberOfColumns>();
    }   
};


template <typename DataType>
class RotationMatrix2D : public GenericMatrix<DataType, 2, 2>
{   
};

template <typename DataType>
class Point2D : public GenericMatrix<DataType, 1, 2>
{
};


int main()
{
    RotationMatrix2D<double> rotMatrix;
    Point2D<double> point;

    point * rotMatrix; //No compiler error here

    return 0;
}

我将数字模板参数更改为int。

您可能还想调整返回类型GenericMatrix&lt; &GT;模板参数以适应返回的矩阵,但这是另一个问题。