C ++ «использование» декларации в Visual Studio 2008 - PullRequest
1 голос
/ 27 февраля 2009

Я пытаюсь использовать 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": символ не может быть использован в используя декларирование

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

Ответы [ 3 ]

4 голосов
/ 27 февраля 2009

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

using namespace google::protobuf;
1 голос
/ 27 февраля 2009

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

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.

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

0 голосов
/ 18 февраля 2016

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

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

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

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

...