我试图编写一个简单的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;的操作数(或者没有可接受的 转化率)
我该如何解决这个问题?
答案 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;模板参数以适应返回的矩阵,但这是另一个问题。