2011-12-22 14 views
1

私はC++、特にGoogle RE2ライブラリへの最初の参加を考えていますが、私はいくつかの構文に固執しています。C++での複雑なconst宣言

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

コード付き:

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

私ははっきりと持っている:

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

は、しかし、私はコンパイラエラーを取得しています私は署名で関数を起動しようとしています第3引数のデータ型が間違っていますが、正しいデータ型が何であるかは誰にでも分かりますか?私はここでのVisual Studio 2010の

+0

※例外ではありません。コンパイラエラーです。 F1キーを押すと表示されます。 – Abyx

+0

また、まず言語を習得してください。 'NULL'は' 0'ではありません。 – Abyx

+4

@Abyx:また、最初に標準を読んでください。「NULL」は「値0の整数定数式」です。 –

答えて

2

あなたはこのようなコードを使用する必要があります。

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

argsconst Arg* args[]に変換されます。

constは、コーリングコードを扱っていません。FindAndConsumeN内でのみ動作します。

deleteアレイを後で設定できないため、newを使用しないでください。
(の場合new const re2::RE2::Arg*[]

+0

それに加えて、引数リストの 'consts'は関数が渡すものを変更しない引数が 'const'と宣言されている場合は、常に'const'を指定することができます。正しい基本タイプを指定するだけです。 –

1

問題でコードをコンパイルしています

は、あなたが一定のデータへのポインタではなく、データへの定数ポインタを必要とするということです。問題のある引数の値を格納するために中間変数を使用すると、問題を並べ替えることができると思います。

+0

それを拡張したり、より完全に説明できるいくつかのリソースの方向に向けることができますか? – Ceilingfish

1

最初に、パラメータ宣言は、関数パラメータとして表示されるとき、わずかに異なる意味の を持つことに注意してください。この場合、第3パラメータの実際のタイプ はArg const* const*です。私はあなたができるとは思わない ここでnew expressionを使用してください(可能であれば、誰がそれを削除しますか)。新しい の式は、new (Arg const* const [n])のようなものになります。初期化されていないconstポインタnの配列を割り当てます。あなたが必要なもの はの線に沿ってもっと何かである:

std::vector<Arg const*> args; 
// Fill out args with the desired data... 
... , &args[0], ... 
0

関数のシグネチャは次のとおりです。

​​

第三引数がconstのArgで[] constの引数を*、これは意味:の 定数配列をarg型を指すconstポインタ

つまり、配列は定数であり、各エントリもconstです。

+0

ありがとうございましたが、私は渡すためにその型のオブジェクトをどのように構築できるのだろうかともっと疑問に思っていました。 – Ceilingfish