Сложные объявления const в C ++ - PullRequest
1 голос
/ 22 декабря 2011

Я беру свой первый набег на C ++, в частности библиотеку Google RE2, и застрял в некоторых синтаксисах. Я пытаюсь вызвать функцию с подписью:

static bool FindAndConsumeN(StringPiece* input, const RE2& pattern,
                         const Arg* const args[], int argc);

С кодом:

const re2::RE2::Arg match;
bool isMatched = RE2::FindAndConsumeN(&inputPiece, *expression,new const re2::RE2::Arg[] { &match },0)

Однако я получаю ошибку компилятора:

Error   3   error C2664: 're2::RE2::FindAndConsumeN' : cannot convert parameter 3 from 'const re2::RE2::Arg (*)[]' to 'const re2::RE2::Arg *const []'

У меня явно неверный тип данных третьего аргумента, но кто-нибудь знает, что это за правильный тип данных?

Я компилирую код с помощью Visual Studio 2010

Ответы [ 4 ]

2 голосов
/ 22 декабря 2011

Вы должны использовать код, подобный этому:

re2::RE2::Arg match;
re2::RE2::Arg* args[] = { &match };
re2::RE2::FindAndConsumeN(NULL, pattern, args, 1);

args будет преобразован в const Arg* args[].

Внутренний const не имеет никакого отношения к вызывающему коду, он работаеттолько в пределах FindAndConsumeN.

Не используйте new, потому что вы не можете delete массив позже.
new это будет new const re2::RE2::Arg*[])

1 голос
/ 22 декабря 2011

Во-первых, обратите внимание, что объявления параметров имеют немного другое значение, когда они появляются в качестве параметров функции.В этом случае фактический тип третьего параметра: Arg const* const*.Я не думаю, что вы можете использовать new expression здесь (и если бы вы могли, кто бы его удалил);требуемое новое выражение будет что-то вроде new (Arg const* const [n]);который выделяет массив n неинициализированных константных указателей.Что вам нужно, это что-то более похожее на:

std::vector<Arg const*> args;
//  Fill out args with the desired data...
... , &args[0], ...
1 голос
/ 22 декабря 2011

Проблема здесь в том, что вам нужен указатель на постоянные данные, а не постоянный указатель на данные.Используйте промежуточную переменную для хранения значения ошибочного аргумента, и я думаю, что вы сможете решить проблему.

0 голосов
/ 22 декабря 2011

Сигнатура функции:

static bool FindAndConsumeN(StringPiece* input, const RE2& pattern,
                            const Arg* const args[], int argc);

Третий аргумент - const Arg * const args [], это означает: константный массив константных указателей для типа Arg.

т.е. массив является постоянным, и каждая запись также постоянна.

...