是否可以转发声明名称空间内的typedef?

时间:2012-02-28 04:51:34

标签: c++ struct typedef forward-declaration

我环顾四周,我无法确定其他类似的问题是否可以回答这个问题。

// 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 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您编译器抱怨,因为lib.hmy.h是独立的头文件,并且他们彼此不了解。此外,与实际class不同,typedef不支持前向声明。

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