Объявление C++ "using" в Visual Studio 2008

Я пытаюсь использовать google protobuf, и у них есть следующий пример:

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;
}

Когда я пытаюсь реализовать этот код в Visual Studio Express 2008, я получаю следующую ошибку:

ошибка C2873: 'google :: protobuf': символ нельзя использовать в объявлении-использовании

Изменить: когда я делаю «using namespace google :: protobuf;» внутри функции это больше не дает мне ошибки. Что меня смущает, так это то, что это не работает так, как показывает пример Google (и Страуструпа в «Языке программирования C++»).

Ответов (3)

(1) Согласно Microsoft, C2873 означает;

'symbol': символ нельзя использовать в объявлении using В директиве using отсутствует ключевое слово пространства имен. Это заставляет компилятор неверно интерпретировать код как объявление using, а не как директиву using.

(2) Также, когда у меня был C2873 с C2039 (я пытался объединить CEF3 и Cinder в Visual Studio 2010), я каким-то образом обошел обе ошибки, изменив Properties-> Configuration Properties-> C/C++ -> Code Generation;

Включить минимальную перестройку: Да (/ Gm), Включить исключение C++: Да (/ EHsc), Включить связывание на уровне функций: пусто

google::protobuf вероятно namespace . В этом случае вам необходимо это сделать.

using namespace google::protobuf;

Напрямую из документации :

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.

Подробнее о разнице.