[英]No suitable user-defined conversion with overloaded constructors and inheritance
抱歉成为这种问题的第100万个问询者!
我正在尝试使用继承将一些基本的向量类放在一起。 不好意思将所有内容都转储到.h中,我的实现将它们拆分开了,但是为了简洁起见,这里将其压缩。
向量
class Vector{
public:
Vector operator+(const Vector& rhs) {
assert(dimensions == rhs.getDimensions());
Vector result(dimensions);
for (char i = 0; i < dimensions; i++) {
result[i] = values[i] + rhs[i];
}
return result;
}
double& operator[](int index) {
//Asserts 0 <= index < dimensions and returns values[index]
}
protected:
Vector(char dimensions) :
dimensions(dimensions), values(dimensions) {}
std::vector<double> values;
private:
char dimensions;
};
Vector3.h
class Vector3 : public Vector {
public:
Vector3(double X, double Y, double Z) :
Vector(3),
x(X), y(Y), z(Z)
{values[0] = x; values[1] = y; values[2] = z;}
double& x, y, z;
private:
Vector3(const Vector& vec) :
Vector3(vec[0], vec[1], vec[2]) {}
};
我很确定这就是问题的全部内容...
这是哪里出错了:
Vector3 myVector3A(1,2,3); //OK
Vector3 myVector3B(4,5,6); //OK
Vector3 myVector3C = myVector3A + myVector3B; //Error: No suitable user-defined conversion for Vector to Vector3
我对继承有些陌生,这可能很痛苦。 我试过在Vector3.h中编写一个新的operator+
,它定义了一个指向Vector
的指针,将其分配给this
指针,然后专门在rhs Vector3
上调用Vector::operator+
,但这并不能将其剪切(嘿)。 一个类似的问题暗示没有办法从Vector
构造Vector3
,因此我尝试将其添加为构造函数,但这也没有做到,而且感觉有点不对劲。 我也尝试过为Vector
手动添加一个拷贝分配运算符,结果相似。
我在哪里错过了什么?
您根本不应该在这里使用继承。 继承根本不适用于二进制运算符。
如果要让通用Vector在维数上抽象,正确的方法是对其进行参数化,创建一个类模板 。
template <size_t D>
class Vector {
// your data and methods here,
// nothing is virtual
};
using Vector3 = Vector<3>;
Vector3 myVector3C = myVector3A + myVector3B;
在这一行中,将调用用户定义的转换构造函数(Vector-> Vector3)。 Vector3(const Vector&vec):Vector3(vec [0],vec [1],vec [2]){}
但是由于此转换构造函数是私有的,因此您可能会遇到编译器错误。 请公开 ,希望它能解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.