为什么要这段代码:
class myvector: public std::complex<float>{
float x;
float y;
public:
myvector(const float x_ = 0, const float y_ = 0) : std::complex::complex(x_), std::complex::complex(y_), x(x_), y(y_) {}
};
int main(){
myvector u, v;
std::cout<< u + v;
}
导致此错误?
error: conversion from ‘std::complex<float>’ to non-`scalar type ‘myvector’ requested`
因为我继承了已经具有重载+运算符的std :: complex,所以我不能访问重载+运算符吗?
答案 0 :(得分:1)
您不需要成员x
和y
,因为这些值存储在您的类继承的std::complex
中。
#include <complex>
#include <iostream>
class myvector : public std::complex<float> {
public:
myvector(const float x_ = 0, const float y_ = 0)
: std::complex<float>{ x_, y_ } // just call the base class constructor
{}
};
int main()
{
myvector u, v;
std::cout << u + v;
}
Thou shalt not inherit from classes that don't have a virtual destructor, though.
答案 1 :(得分:1)
问题是编译器不知道如何将std::complex<float> operator+(const std::complex<float>&, const std::complex<float>&)
应用于您的具体类myvector
。直接的解决方法是为您的类或隐式转换构造函数编写一个重载的operator +:
class myvector : public std::complex<float> {
public:
myvector(const float x_ = 0, const float y_ = 0)
: std::complex<float>{ x_, y_ } // just call the base class constructor
{}
myvector(const std::complex<float> &ref) : std::complex<float>(ref) {}
};
但是,您似乎正在尝试通过使用继承来扩展std::complex
类的功能,这通常不是一个好主意,因为其析构函数不是虚拟的。更好的方法是让std::complex
成为您myvector
的成员,并提供自己的公共API。