2009-02-26 8 views
1

Je suis en train d'utiliser google protobuf et ils ont l'exemple suivant:C++ « en utilisant » déclaration dans Visual Studio 2008

using google::protobuf; 

protobuf::RpcChannel* channel; 
protobuf::RpcController* controller; 
SearchService* service; 
SearchRequest request; 
SearchResponse response; 

void DoSearch() { 
    // You provide classes MyRpcChannel and MyRpcController, which implement 
    // the abstract interfaces protobuf::RpcChannel and protobuf::RpcController. 
    channel = new MyRpcChannel("somehost.example.com:1234"); 
    controller = new MyRpcController; 

    // The protocol compiler generates the SearchService class based on the 
    // definition given above. 
    service = new SearchService::Stub(channel); 

    // Set up the request. 
    request.set_query("protocol buffers"); 

    // Execute the RPC. 
    service->Search(controller, request, response, protobuf::NewCallback(&Done)); 
} 

void Done() { 
    delete service; 
    delete channel; 
    delete controller; 
} 

L'erreur que je reçois lorsque je tente de mettre en œuvre ce code dans Visual Studio Express 2008 est:

erreur C2873: google :: protobuf ': symbole ne peut pas être utilisé dans un en utilisant déclaration

Edit: Quand je fais "using namespace google :: protobuf;" à l'intérieur d'une fonction, cela ne me donne plus l'erreur. Ce que je suis confus, c'est que cela ne fonctionne pas comme l'exemple de Google (et Stroustrup dans "The C++ Programming Language") semblent indiquer.

+0

Pouvez-vous faire référence à l'exemple de Google ou la section de TC++ PL que vous sont les suivantes? –

+0

ou voulez-vous dire espace de noms protobuf = google :: protobuf; ? –

+0

L'exemple Google que je connais (http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html) n'a qu'une déclaration using sur l'espace de noms std. –

Répondre

4

google::protobuf est probablement un namespace. Dans ce cas, vous devez le faire.

using namespace google::protobuf; 
+0

Vrai, et peut-être un peu plus propre dans cette situation. Je ne savais pas si 'SearchService :: Stub' avait besoin d'une qualification protobuf, cependant. –

+0

vrai, je m'interroge à ce sujet aussi. de toute façon j'ai déplacé ma question comme commentaire à la question principale j'ai pensé que c'est mieux adapté là :) –

1

directement à partir de la documentation:

Visual C++ Concepts: Building a C/C++ Program 
Compiler Error C2873 
Error Message 
'symbol' : symbol cannot be used in a using-declaration 
A using directive is missing a namespace keyword. This causes the compiler to misinterpret the code as a using declaration rather than a using directive. 

More info on the difference.

0

(1) Selon Microsoft, les moyens de C2873; 'Symbole': symbole ne peut pas être utilisé dans une déclaration using Une directive using manque un mot-clé namespace. Cela provoque le compilateur à interpréter le code comme une déclaration using plutôt qu'une directive using.

(2) Aussi quand j'avais C2873 avec C2039 (j'ai essayé de fusionner CEF3 et Cinder dans Visual Studio 2010), j'ai contourné les deux erreurs en modifiant Propriétés-> Propriétés de configuration-> C/C++ -> Génération de code ;

Activer Minimal Rebuild: Oui (/ Gm), Activer C++ Exception: Oui (/ EHsc), Activer la fonction de niveau liaison: vide