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

Is it possible to forward declare a typedef that is within a namespace?

本文关键字:typedef 命名空间 声明 转发 是否      更新时间:2023-10-16

我环顾四周,我不太清楚其他类似的问题是否回答了这个问题。

// 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.

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

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

命名空间

与问题无关。不能转发声明类型定义;只能向前声明实际类型(类和结构(。