如何在c++中声明一个类型定义?

How do I forward declare a typedef in C++?

本文关键字:一个 类型 定义 c++ 声明      更新时间:2023-10-16

我有两个名称空间(FM),我使用typedef来定义一些东西。我使用一个命名空间中的typedef来声明另一个命名空间中的变量。

例如我有这些文件:

File M.hpp

#ifndef M_HPP
#define M_HPP
#include "F.hpp"
namespace M{
    typedef std::vector<F::myD> VectorDouble;
class M{
    private:
        VectorDouble Diction;
};
}
#endif  // M_HPP

File F.hpp

#ifndef F_HPP
#define F_HPP
#include "M.hpp"
namespace F{
    typedef double myD;
class MyF{
    private:
        M::VectorDouble myVar;
};
}
#endif  // F_HPP

很明显,这两个头文件创建了一个循环依赖,所以前向声明可能是必要的,但是如何使用名称空间和类型定义呢?

文件namespace.cpp驱动代码:

#include <iostream>
#include <vector>
#include "M.hpp"
#include "F.hpp"
int main(){
    std::cout << "Learning how to access stuff in a namespace." << std::endl;
    F::MyF myFInstance;
    M::M myMInstance;
    return 0;
}

当我尝试编译时,我得到一个错误,我的M是一个未声明的标识符(见下面确切的错误消息)。我不明白为什么M不被视为namespace

$ clang++ -std=c++11 -stdlib=libc++ namespace.cpp -o namespace
In file included from namespace.cpp:5:
In file included from ./M.hpp:5:
./F.hpp:12:9: error: use of undeclared identifier 'M'
        M::VectorDouble myVar;
        ^
1 error generated.

如何从另一个命名空间访问类型定义?这是前向声明问题吗?

您的问题是您创建了循环包含

通过您自己的编码,如果不首先包含M.hpp,则无法编译文件F.hpp

并且M.hpp必须先包含F.hpp才能编译。

因此,这两个头文件都不能编译。关于循环依赖的解决方案,请参阅这篇文章。

编辑:

你可以像这样声明你的typedef。

File F_fwd.hpp

#ifndef F_FWD_HPP
#define F_FWD_HPP
namespace F{
    typedef double myD;
}
#endif // F_FWD_HPP

您的两个头文件相互包含,这将导致循环引用,并且有了头文件守卫,一个文件可以完全排除在其他头文件中。

相关文章: