2017-02-13 25 views
1

rapidjson::Documentへのポインタを引数として渡しています。C++ - rapidjson :: Documentを関数の引数として渡す

foo(rapidjson::Document* jsonDocument) 
{ 
    std::cout << jsonDocument["name"] << std::endl; 
} 

しかし、私は、name属性にアクセスするためにjsonDocument["name"]を行うことはできません。ポインタを使用しないようにしようと

はエラーにつながる:

error: 'rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>::GenericDocument(const rapidjson::GenericDocument<Encoding, Allocator, StackAllocator>&) [with Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; StackAllocator = rapidjson::CrtAllocator]' is private 
GenericDocument(const GenericDocument&); 

誰かが私を助けることができますか?

+2

はだまされやすい人を見つけることができませんが、多くがあります。要するに、 '(* jsonDocument)[" name "]'や 'jsonDocument [0] [" name "]'のように使用する前にポインタの参照を解除するか、 'rapidjson :: Document&jsonDocument'のような参照を使用する必要があります。 – nwp

+0

リファレンスを使用するのが最適です。 –

答えて

0

引数として参照または値を使用します。ポインタ付きの[]を使用すると、ドキュメントをドキュメントの配列のように使用しようとします。参照または値によって、期待される演算子が呼び出されます。

// a const reference 
foo(const rapidjson::Document& jsonDocument) { 
    std::cout << jsonDocument["name"] << std::endl; 
} 

// a copy (or move) 
foo(rapidjson::Document jsonDocument) { 
    std::cout << jsonDocument["name"] << std::endl; 
} 

あなたの関数は、ドキュメント内の任意のリソースを消費する必要がありますが、値のみを観察し、印刷しないように私は、参照を使用することをお勧めいたします思います。

この関数の呼び出しは次のようになります。

rapidjson::Document doc = /* ... */; 

foo(doc); 
+0

ありがとう、私はconst参照を使用しています。 –

関連する問題