Проблема с сигнатурой метода C ++ - PullRequest
2 голосов
/ 01 февраля 2011

Я пытаюсь вызвать 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?

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Вот как я переписал ваш код, чтобы он компилировался:

#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.

1 голос
/ 01 февраля 2011
template <size_t N>
void addValues(vector<tm>* newDates, vector<double> (&newValues)[N]);

Причина, по которой это работает, в том, что это шаблон. Значение N известно во время компиляции, поскольку вы определяете значения в виде массива: vector<double> values[COUNT]. Поскольку компилятор знает размер значений во время компиляции, он может заменить N на COUNT.

Поскольку это шаблон, вы сможете вызывать эту функцию с любым массивом размеров, необязательно размером COUNT.

Я бы также рекомендовал изменить newDates на ссылку, как предложил Фред Нурк.

template <size_t N>
void addValues(vector<tm>& newDates, vector<double> (&newValues)[N]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...