如何在c++中声明一个类型定义?
How do I forward declare a typedef in C++?
我有两个名称空间(F
和M
),我使用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
您的两个头文件相互包含,这将导致循环引用,并且有了头文件守卫,一个文件可以完全排除在其他头文件中。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 更改可变参数模板中的最后一个类型
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 有没有办法同时将一个类型分配给C++中的多个模板?
- C++:可以模板化一个类型名称吗
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 给定一个类型为 Container:<T>:Iterator 的函数参数,如何为某些类型的 T 实现特定的重载?
- 期望一个类型,得到一个模板
- 初始化一个类型向量的巨大向量<int>
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 具有多种类型的类数组?如何访问数组中的一个类型
- Opencv C++ 声明一个类型为 uint8 的矩阵
- 模板参数列表中只有一个类型名称是什么意思?
- C++模板部分特化:为什么我无法匹配可变参数模板中的最后一个类型
- 为什么我们有一个类型不匹配
- 在函数模板中将一个类型名映射到另一个类型名
- 创建一个类型bool的向量,其中所有值均可初始化为true
- 在C API中定义了一个类型,如何将其与命名空间中的C++类相关联