2011-02-01 61 views
2

我试图拨打以下addValues:和C++方法签名问题

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

不可复制:http://ideone.com/FEX9w – kennytm 2011-02-01 08:06:23

+0

除了`std :: vector`之外,你还使用了什么其他`vector`? – 2011-02-01 08:12:02

回答

1
template <size_t N> 
void addValues(vector<tm>* newDates, vector<double> (&newValues)[N]); 

这个工作的原因是因为它的模板。值N在编译时已知,因为您将值定义为数组:vector<double> values[COUNT]。由于编译器在编译时知道值的大小,因此它可以用COUNT代替N

由于它是一个模板,您将能够使用任何大小的数组调用此函数,而不一定是COUNT大小。

我还建议将newDates更改为参考,正如Fred Nurk所建议的那样。

template <size_t N> 
void addValues(vector<tm>& newDates, vector<double> (&newValues)[N]); 
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值相同。