如何让编译器区分 f(double...) 和 f(int, double...)

问题描述 投票:0回答:1

我正在编写一个用于处理多项式的小型库。

主类称为

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++ variadic-functions constructor-overloading
1个回答
0
投票

当您可以使用类型安全的 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>

© www.soinside.com 2019 - 2024. All rights reserved.