C++ 没有使用重载构造函数和继承进行适当的用户定义转换

C++ 没有使用重载构造函数和继承进行适当的用户定义转换,c++,inheritance,C++,Inheritance,很抱歉,我是第100万个问这种问题的人 我正在尝试使用继承来组合一些基本的向量类。请原谅在.h中转储所有内容,我的实现将它们拆分,但为了简洁起见,我将它们压缩到这里 向量h class Vector{ public: Vector operator+(const Vector& rhs) { assert(dimensions == rhs.getDimensions()); Vector result(dimensions); for (char i = 0;

很抱歉,我是第100万个问这种问题的人

我正在尝试使用继承来组合一些基本的向量类。请原谅在.h中转储所有内容,我的实现将它们拆分,但为了简洁起见,我将它们压缩到这里

向量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 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中编写一个新的操作符+,它定义了一个指向Vector的指针,分配给它,然后专门调用rhs Vector3上的Vector::operator+,但这并没有解决这个问题。一个类似的问题意味着无法从向量构造Vector3,所以我尝试将其作为构造函数添加,但这也不行,而且感觉有点错误。我还尝试为Vector手动添加一个复制赋值操作符,结果类似


我在哪里错过了一些东西?

您不应该在这里使用继承。继承不适用于二进制运算符

如果希望泛型向量在维度数上进行抽象,正确的方法是将其参数化,创建一个类模板


您不应该在这里使用继承。继承不适用于二进制运算符

如果希望泛型向量在维度数上进行抽象,正确的方法是将其参数化,创建一个类模板

Vector3 myVector3C=myVector3A+myVector3B

在这一行中,将调用用户定义的转换构造函数Vector->Vector3。 向量3约束向量和向量: Vector3vec[0],vec[1],vec[2]{}

但由于此转换构造函数是私有的,因此可能会出现编译器错误。 请公开,希望它能得到解决。

vector3myvector3c=myVector3A+myVector3B

在这一行中,将调用用户定义的转换构造函数Vector->Vector3。 向量3约束向量和向量: Vector3vec[0],vec[1],vec[2]{}

但由于此转换构造函数是私有的,因此可能会出现编译器错误。
请将其公开,希望它能得到解决。

最好是向代码展示您是如何实现operator+的,谢谢您的建议,并澄清了问题的其余部分。我正在尝试使用您不应该使用的继承来组合一些基本的向量类。它不适用于其他任何人,也不适用于你。在Vector3中,作为双参数x、y、double和z的悬空引用的x与vector中的值向量有什么区别?没有区别,这是为了与使用someVector3.x和someVector3[0]的现有代码兼容可以互换,但我可以看出这个实现根本不起作用。我将用@n.m的建议重写它。最好你展示一下你是如何实现operator+的,谢谢你的建议,并澄清了问题的其余部分。我正试图用你不应该使用的继承来组合一些基本的向量类。它不适用于其他任何人,也不适用于你。在Vector3中,作为双参数x、y、double和z的悬空引用的x与vector中的值向量有什么区别?没有区别,这是为了与使用someVector3.x和someVector3[0]的现有代码兼容可以互换,但我可以看出这个实现根本不起作用。我将使用@n.m的建议重写它。这看起来更合理。非常感谢你的想法+1表示不使用继承。Vector具有任意元素,则Vector3不是矢量。应该有一个没有继承的概念,它模拟了一种非继承关系;这看起来更合理。非常感谢你的想法+1表示不使用继承。Vector具有任意元素,则Vector3不是矢量。应该有一个没有继承的概念,它模拟了一种非继承关系;
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
template <size_t D>
class Vector {
   // your data and methods here, 
   // nothing is virtual
};

using Vector3 = Vector<3>;