使用`using`定义的前向声明类型

时间:2015-06-12 15:38:25

标签: c++ boost forward-declaration

我们假设我有这样的情况:

//A.hpp
#include "B.hpp"
#include "C.hpp"
#include "D.hpp"

using A = boost::variant<B, C, D>;

//B.hpp
#include <memory>

class A;
using AA = std::unique_ptr<A>;

这给了我以下错误:error: typedef redefinition with different types ('boost::variant<B, C, D>' vs 'A')

我无法在#include中省略A.hpp因为boost::variant需要完整的类型。

如何转发声明使用A定义的using

如果不可能,我现在想,如何解决我的问题,避免大量的样板代码。

2 个答案:

答案 0 :(得分:4)

  

我无法在#include中省略A.hpp,因为boost::variant需要完整的类型。

由于您未在此处实例化boost::variant,因此无关紧要。

继续并省略#include s。

live demo

然后你的问题就消失了:

  

如何转发使用?

定义的声明A.

别。再次使用using,或者更好的是,将using语句提升到自己的标题中,然后可以将其包含在任何需要的地方。

答案 1 :(得分:2)

只需将B.hpp中的class A;替换为using A = boost::variant<B, C, D>;

即可

using关键字不会向前声明任何内容;它只是声明了一个类型别名。所以,在&#34; A.hpp&#34;如果包含&#34; B.hpp&#34;,则将名为A的类的前向声明和名为A的类型别名的声明放在同一个翻译单元中。