2011-01-21 4 views
4

私は現在のプロジェクトにrapidxmlを含めることを試みています。しかし、それは構築されません。MSVCで奇妙なコードが壊れています。どういう意味ですか?

Visual Studioは、コードのこの部分に文句を言うでしょう(rapidxml.hpp:419 + 451):エラーC2061:

419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>)); 
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>; 

コンパイラは

rapidxml.hpp(420)言います:構文エラー:識別子 'メモリ'

これはコンパイラがどのように混乱するかをよく見ています。実際に私にはかなり混乱しています。 new(memory) xml_attribute<Ch>(memory)の部分は何ですか?

(memory)の部分を削除してもうまくコンパイルされます。
また、gccは(memory)が含まれているとうまくコンパイルします。

編集:
ああ、私はいくつかのメモリのデバッグを行うためにDEBUG_NEWnewをオーバーロードされます。 DEBUG_NEWは新しいプレースメントをサポートしていません。

+1

コンパイラよりもユーザを混乱させる方が簡単なはずです...コンパイラはその言語とすべての細部の詳細を知っている必要がありますが、ユーザは限られており、あまり知っているだけです。 –

答えて

1

これは「プレースメント新しい」と呼ばれます。新しいメモリを割り当てる代わりにxml_attributeのインスタンスをmemoryにインスタンス化します。参照:

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

VC2010はしかし、構文に問題がある理由は、私はよく分かりません。

3

これは私の提案です。 "メモリ"自体はマクロのどこかで定義されており、問題を引き起こすように拡張されています。したがって、メモリがマクロとして定義されているかどうかを調べるには、#define.memory(正規表現を使用)を検索してください。

次のステートメントについては、このフォーム:あなたはあなたのためのメモリを割り当てるために、独自のメモリアロケータを使用したいとき

new(allocator) ObjectType(...) 

が使用されています。

これが役に立ちます。

+0

いくつかの特定のクラスオブジェクトをカスタム方法で割り当てたい場合は、placement-newを使用する代わりに 'operator new'メンバ関数をオーバーロードするだけでよいことに注意してください。 – sharptooth

1

構文new (pointer) type(argument)配置新しいと呼ばれ、それは基本的に以前pointerに割り当てられたメモリを超える与えargumenttypeコンストラクタへの呼び出しを表します。

構文は、表示されているとおりに正しいです。上の2行は、パーサーを混乱させるセミコロンや構文エラーがありませんが、識別子としてmemoryは前の行で定義されているように使用されています。 (そしてそれは実装のための言語によって予約されていません)

3

#< >そのファイルに#includeが含まれていますか?

+0

@David:VCについてはわかりませんが、g ++にはVCが必要です。 – Tomek

+0

私は、そのファイルに '#include 'があります。 – bastibe

関連する問題