我们假设我有这样的情况:
//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
?
如果不可能,我现在想,如何解决我的问题,避免大量的样板代码。
答案 0 :(得分:4)
我无法在
#include
中省略A.hpp
,因为boost::variant
需要完整的类型。
由于您未在此处实例化boost::variant
,因此无关紧要。
继续并省略#include
s。
然后你的问题就消失了:
如何转发使用?
定义的声明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的类型别名的声明放在同一个翻译单元中。