繁体   English   中英

没有适当的用户定义的转换,带有重载的构造函数和继承

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM