Форвард объявить глобальный тип внутри пространства имен - PullRequest
2 голосов
/ 02 марта 2010

Я хочу использовать стороннюю библиотеку, не используя ее заголовочный файл. Мой код находится в своем собственном пространстве имен, поэтому я не могу использовать обычное прямое объявление, поскольку не хочу загрязнять глобальное пространство имен. В настоящее время у меня есть что-то подобное:

3rd-party-library.h----

typedef struct {...} LibData;
void lib_func (LibData *);

my-source.h-----

namespace foo {

    /*forward declaration of LibData*/

    class Abcd {
        public:
            void ghj();
        private:
            Libdata *data_;
        };
    }//namespace foo

my-source.cpp-----
#include "my-source.h"
#include <3rd-party-library.h>

namespace foo {
    typedef ::LibData LibData;
    void Abcd::ghj() {
        //do smth with data_
        }
    }//namespace foo

Можно ли переслать объявление глобального типа таким образом, чтобы он находился в пространстве имен? Обычный простой typedef не работает.

Ответы [ 3 ]

7 голосов
/ 02 марта 2010

Чтобы сработало предварительное объявление, вам необходимо объявить объект в правильном пространстве имен. Поскольку исходный объект находится в глобальном пространстве имен, вам необходимо заранее объявить его в глобальном пространстве имен.

Если вам это не нравится, вы всегда можете обернуть вещь в свою структуру:

namespace foo {
struct libDataWrapper; }

и в вашем собственном cpp определите эту структуру. Или вы всегда можете прибегнуть к void * и тому подобному, если вы готовы к таким вещам.

2 голосов
/ 02 марта 2010

, так как вы используете указатель, я '' 'просто объявляю фиктивный объект внутри вашего собственного пространства имен, а затем использую reinterpret_cast, чтобы связать реальный объект с существующим указателем.

ваш-source.h

namespace foo {

//forward declare
class externalObj;

class yourObj
{
public:
  yourObj();
  ~yourObj();
  void yourFunction();

private:
 externalObj* pExt;
};

}

ваш-implementation.cpp

#include "your-source.h"
#include "externalObj-header.h"

namespace foo {

yourObj::yourObj() :
pExt ( reinterpret_cast<externalObj*>(new ::externalObj()) )
{
}

yourObj::~yourObj()
{
}

void yourObj::yourFunction()
{
   reinterpret_cast<::externalObj*>(pExt)->externalFunction();
}

}
1 голос
/ 02 марта 2010

Разве вы не можете просто обернуть включение для сторонней библиотеки в собственное пространство имен?

namespace ThirdParty {
#include "thirdparty.h"
}

namespace foo {

  ... your code

  ThirdParty::LibData *d;

}
...