Можно ли перенаправить объявление typedef, который находится в пространстве имен? - PullRequest
4 голосов
/ 28 февраля 2012

Я огляделся и не могу точно сказать, отвечают ли другие подобные вопросы на это или нет.

// lib.h
namespace lib_namespace
{
  struct lib_struct
  {
    typedef std::vector<LibObject> struct_value;
  };

  typedef lib_struct::struct_value lib_value; // compiler points here
};

// my.h
// attempt at forward declaration
namespace lib_namespace { class lib_value; };
...

// my.cpp
#include "lib.h"

Я получаю ошибку компилятора переопределения, которая понятна, но есть ли способвперед объявить что typedef?

Мое намерение состоит в том, чтобы избежать добавления lib.h как зависимости вне библиотеки, которую я создаю.Возможно, есть лучший способ добиться этого?

Редактировать: Чтобы уточнить, я стараюсь избегать добавления строки дополнительных каталогов для всех файлов проекта, которые будут использовать библиотеку, которую я создаю из-за третьейЯ использую библиотеку для вечеринок, и в описанной выше ситуации я застрял.Так что все в порядке, если я включу lib.h в my.cpp, но не my.h.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Ваш компилятор жалуется, потому что lib.h и my.h являются независимыми заголовочными файлами и не знают друг о друге. Более того, в отличие от фактического class, typedef не поддерживает предварительное объявление.

Предположим, вы не хотите #include"lib.h", тогда вы можете создать отдельный заголовок с typedef lib_struct::struct_value lib_value; и соответствующей частью, связанной с ним. #include этот новый заголовок, где это необходимо.

1 голос
/ 28 февраля 2012

Пространства имен не имеют отношения к вопросу. Вы не можете переслать объявление typedef; только фактические типы (классы и структуры) могут быть объявлены заранее.

...