Вперед объявить typedef

У меня есть большой файл заголовка (~ 10000 строк), который автоматически генерируется скриптом / программой вне моего контроля.

Чтобы не включать этот файл в объявление моего класса, я заранее объявляю несколько необходимых мне типов:

--myclass.h

namespace bl {
   class TypeA;
   class TypeB;
}
// Other stuff and myclass definition...

Теперь выясняется, что TypeA и TypeB не являются именами классов, а вместо этого определены внутри автоматически сгенерированного файла как:

typedef SomeUnspecifiedClassName TypeA;
typedef AnotherUnspecifiedClassName TypeB;

Под SomeUnspecifiedClassName я подразумеваю, что я не могу пересылать-объявить это имя типа, потому что оно может измениться при различных обстоятельствах.

Как я могу объявить пересылку typedef? (Не могу использовать c ++ 11)


person sbabbi    schedule 29.04.2013    source источник
comment
Можете ли вы использовать класс через ссылки и указатели? stackoverflow.com/questions/553682/   -  person    schedule 30.04.2013
comment
Ответ на ваш конкретный вопрос в вашем последнем предложении уже дан в первом связанном вопросе: stackoverflow.com/questions/804894/   -  person jxh    schedule 30.04.2013
comment
В зависимости от того, где используются TypeA и TypeB, вы можете рассмотреть возможность рефакторинга myclass в шаблон.   -  person jxh    schedule 30.04.2013


Ответы (3)


Просто - нельзя. Однако если вы опубликуете свои конкретные ситуации, могут быть некоторые обходные пути к тому, что вы хотите сделать.

person Jim Buck    schedule 29.04.2013
comment
Я работал с некоторыми макросами (на самом деле их много), вводя непосредственно неуказанные типы. - person sbabbi; 30.04.2013

Вы можете написать сценарий, который извлекает ...UnspecifedClassName из строк typedef в автоматически сгенерированном исходном файле. Затем этот сценарий будет основой вашего собственного автоматически сгенерированного файла заголовка, который будет пересылать им объявления этих классов, а также ваши typedef операторы. Ваш myclass.h файл может затем #include этот заголовочный файл.

person jxh    schedule 29.04.2013

Одно относительно приличное решение, которое я иногда находил полезным, - это создать тривиальный класс-оболочку:

Поместите в заголовочный файл:

class ClassA;
// now use pointers and references to ClassA at will

Поместите в исходный файл:

#include <NastyThirdPartyHeader>

class ClassA: public TypeA {
public:
  ClassA(TypeA const &x): TypeA(x) {}
  ClassA &operator=(TypeA const &x) {
    TypeA::operator=(x);
    return *this;
  }
};

В зависимости от вашего варианта использования это может быть все, что вам нужно.

person Daniel Wagenaar    schedule 20.07.2014