C++ 在命名空间内正向声明全局类型

C++ 在命名空间内正向声明全局类型,c++,forward-declaration,C++,Forward Declaration,我想使用第三方库而不使用其头文件。我的代码驻留在它自己的名称空间中,因此我不能使用传统的前向声明,因为我不想污染全局名称空间。目前我有这样的想法: 3rd-party-library.h---- typedef struct {...} LibData; void lib_func (LibData *); my-source.h----- namespace foo { /*forward declaration of LibData*/ class Abcd {

我想使用第三方库而不使用其头文件。我的代码驻留在它自己的名称空间中,因此我不能使用传统的前向声明,因为我不想污染全局名称空间。目前我有这样的想法:

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
第三方库.h----
typedef结构{…}LibData;
void lib_func(LibData*);
我的消息来源-----
名称空间foo{
/*LibData的转发声明*/
类Abcd{
公众:
void-ghj();
私人:
Libdata*数据u2;;
};
}//名称空间foo
my-source.cpp-----
#包括“my source.h”
#包括
名称空间foo{
typedef::LibData LibData;
void Abcd::ghj(){
//使用数据进行smth_
}
}//名称空间foo

是否可以以驻留在命名空间中的方式向前声明全局类型?普通简单的typedef不起作用。

因为您使用的是指针,所以我只需在您自己的命名空间中向前声明一个虚拟对象,然后使用reinterpret_cast将实际对象绑定到现有指针

你的消息来源

namespace foo {

//forward declare
class externalObj;

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

private:
 externalObj* pExt;
};

}
your-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();
}

}
#包括“your source.h”
#包括“externalObj header.h”
名称空间foo{
yourObj::yourObj():
pExt(重新解释强制转换(new::externalObj())
{
}
yourObj::~yourObj()
{
}
void yourObj::yourFunction()
{
重新解释强制转换(pExt)->externalFunction();
}
}

要使前向声明起作用,您需要在适当的命名空间中前向声明一个对象。由于原始对象驻留在全局名称空间中,因此需要在全局名称空间中向前声明它

如果你不喜欢,你可以用自己的结构来包装:

namespace foo {
struct libDataWrapper; }

在您自己的cpp中定义此结构。或者,如果你能做到这一点,你也可以求助于void*之类的东西。

你不能简单地将第三方库的include封装在它自己的名称空间中吗

namespace ThirdParty {
#include "thirdparty.h"
}

namespace foo {

  ... your code

  ThirdParty::LibData *d;

}