我正在尝试调用下面的addValues:
Obj *s = new Obj();
vector<tm> dates(SIZE);
vector<double> values[COUNT];
for (uint i = 0; i < COUNT; i++) {
values[i] = vector<double>(SIZE);
}
s->addValues(&dates, &values); // <- this is the error line
我定义了addValues:
void addValues(vector<tm> *newDates, vector<double> (*newValues)[COUNT]);
确切的错误是:
no matching function for call to ‘Stock::addValues(std::vector<tm, std::allocator<tm> >*, std::vector<double, std::allocator<double> > (*)[5])’
我认为这个想法是我的方法签名不匹配。 addValues的正确签名是什么?
答案 0 :(得分:1)
template <size_t N>
void addValues(vector<tm>* newDates, vector<double> (&newValues)[N]);
这个工作的原因是因为它是一个模板。由于您将值定义为数组,因此在编译时已知值N
:vector<double> values[COUNT]
。由于编译器在编译时知道值的大小,因此能够用N
替换COUNT
。
由于它是一个模板,您可以使用任何大小的数组调用此函数,不一定是COUNT大小。
我还建议将新日期更改为参考,正如Fred Nurk建议的那样。
template <size_t N>
void addValues(vector<tm>& newDates, vector<double> (&newValues)[N]);
答案 1 :(得分:1)
这就是我重写代码以使其编译的方式:
#include <ctime>
#include <vector>
using namespace std;
typedef unsigned int uint;
#define SIZE 3
#define COUNT 3
struct Obj {
void addValues(vector<tm> *newDates, vector<double> (*newValues)[COUNT])
{}
};
int main() {
Obj *s = new Obj();
vector<tm> dates(SIZE);
vector<double> values[COUNT];
for (uint i = 0; i < COUNT; i++) {
values[i] = vector<double>(SIZE);
}
s->addValues(&dates, &values);
}
它正确编译。
如您所见,代码与您的代码几乎相同。尝试检查成员函数声明中使用的COUNT值是否与创建values
的COUNT值相同。