我正在编写一个用于处理多项式的小型库。
主类称为
poly
,它包含 4 个重载构造函数。
poly
类的对象是一个多项式的表示。
完整代码可以在这里查看:https://github.com/IQ8QI/polynomial-lib
在
./test-poly/test-all.cpp
中,我正在尝试创建一个poly
类的对象:
poly::poly my_poly = poly::poly((double)6.0, -2.0, 4.0);
类
poly
的构造函数是:
//Create polynomial using just numbers
poly(double values...);
//Create polynomial using vector<double>
poly(vector<double> values);
//Create polynomial with non-zero base
poly(int base, double values...);
//Create polynomial with non-zero base and vector
poly(int base, vector<double> values);
不幸的是,我收到编译错误:
./test-all.cpp:20:63: error: call of overloaded ‘poly(double, double, double)’ is ambiguous
20 | poly::poly my_poly = poly::poly((double)6.0, -2.0, 4.0);
| ^
In file included from ./test-all.cpp:3:
././../polynomial-lib/polynomial.hpp:22:17: note: candidate: ‘poly::poly::poly(int, double, ...)’
22 | poly(int base, double values...);
| ^~~~
././../polynomial-lib/polynomial.hpp:16:17: note: candidate: ‘poly::poly::poly(double, ...)’
16 | poly(double values...);
| ^~~~
我知道编译器无法确定使用哪个构造函数。
我想继续使用有 4 个构造函数 poly() 的解决方案。
为了解决这个问题,我可以将其中 2 个构造函数更改为构建器函数,但我不喜欢它:
//Create polynomial with non-zero base
poly special_poly(int base, double values...){
poly temp_poly = poly(values...);
temp_poly.set_base(base);
return temp_poly;
}
//Create polynomial with non-zero base and vector
poly special_poly(int base, vector<double> values){
poly temp_poly = poly(values);
temp_poly.set_base(base);
return temp_poly;
}
没有构建器函数可以完成吗?
当您可以使用类型安全的 C++ 可变参数模板时,您不需要 C 可变参数。但是,您已经有一个采用
std::vector
的构造函数,因此我认为不需要多个构造函数:
#include <vector>
struct poly{
std::vector<double> coeffs;
int base = 0;
poly(const std::vector<double>& c,int b = 0) : coeffs(c),base(b) {}
};
int main() {
poly p1{{1.0,2.0,3.0}};
poly p2{{1.0,2.0,3.0},0};
}
我选择了
std::vector
,因为这就是你的要求。不过,如果您实际上不需要传递已构造的向量,而只是将 double
列表传递给构造函数,则可以将参数更改为 std::initializer_list<double>
。