2012-02-28 49 views
4

我环顾四周,我无法确定其他类似问题是否回答此问题。是否可以转发声明名称空间内的typedef?

// 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作为我正在创建的库之外的依赖项。也许有更好的方法来实现这一目标?

编辑:为了澄清,我试图避免将额外的包含目录行添加到所有项目文件,因为我使用的是第三方库而使用我创建的库,上述情况是我被卡住了。因此,如果我在my.cpp中包含lib.h,但不包括my.h

回答

1

你编译器抱怨,因为lib.hmy.h是独立的头文件,他们不知道对方。此外,与实际的class不同,typedef不支持前向声明。

假设您不想#include"lib.h",那么您可以创建一个单独的标题,其中包含typedef lib_struct::struct_value lib_value;以及与其相关的相关部分。 #include表示需要的新标题。

1

命名空间与问题无关。你不能转发声明typedef;只有实际的类型(类和结构)才能被声明。

相关问题