如何在C ++中转发声明typedef?

时间:2014-06-04 17:38:45

标签: c++ namespaces typedef

我有两个名称空间(FM),其中我使用typedef来定义某些内容。我在一个名称空间中使用typedef来声明另一个名称空间中的变量。

例如我有这些文件:

档案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

档案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

很明显,这两个头文件创建了循环依赖,因此可能需要前向声明,但如何使用名称空间和typedef?

文件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.

如何从其他命名空间访问typedef?这是一个前向声明问题吗?

2 个答案:

答案 0 :(得分:1)

您的问题是您已创建循环播放

根据您自己的编码,您的文件F.hpp无需先包含M.hpp即可进行编译。

M.hpp无法在不先包含F.hpp的情况下进行编译。

因此,既不能编译头文件。有关循环依赖关系的解决方案,请参阅this SO post

修改

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

档案F_fwd.hpp

#ifndef F_FWD_HPP
#define F_FWD_HPP

namespace F{
    typedef double myD;
}

#endif // F_FWD_HPP

答案 1 :(得分:0)

你的两个标题相互包含,这将导致循环引用,并且标题gaurds,一个文件可以完全排除在其他标题之一。