在c++类中向前声明typedef
Forward declare typedef within C++ class
在类中向前声明typedef的最佳解决方案是什么?下面是我需要解决的一个例子:
class A;
class B;
class A
{
typedef boost::shared_ptr<A> Ptr;
B::Ptr foo();
};
class B
{
typedef boost::shared_ptr<B> Ptr;
A::Ptr bar();
};
我想我可以这样做:
boost::shared_ptr<B> foo();
但是有更优雅的解决方案吗?
不幸的是,没有向前声明typedef
这样的事情。但是,使用后期模板实例化有一个技巧:
template <typename T> class BImpl;
template <typename T>
class AImpl
{
public:
typedef boost::shared_ptr<AImpl> Ptr;
typename BImpl<T>::Ptr foo();
};
template <typename T>
class BImpl
{
public:
typedef boost::shared_ptr<BImpl> Ptr;
typename AImpl<T>::Ptr bar();
};
typedef AImpl<void> A;
typedef BImpl<void> B;
这应该有望完成你的目标。
你面临着两个截然不同的困难:1. 没有类型的前向声明2. 嵌套类型的前向声明是不可能的
没有办法绕过第二个:你必须打开类型。
我偶尔使用的一种方法是创建一个派生类型,并且可以前向声明。说:
struct Ptr : shared_ptr<A> {};
这是一个新类型,但它与同义词几乎相同。当然,问题出在构造函数上,但在c++ 11中,这个问题正在得到改善。
这个答案当然是一般的。对于您的具体情况,我认为您应该在类之外定义ptr,这样就完全没有问题了。
struct A;
struct B;
typedef shared_ptr<A> APtr;
typedef shared_ptr<B> BPtr;
没有办法向前声明
- a
typedef
- 另一个类的名称
所以-你不能向前声明一个typedef
,即使你可以,你仍然不能这样做,因为你需要这样做:
class B::Ptr;
这是不可能的
你不能。
但是你可以解耦类的Ptr定义:
class A;
class B;
template <typename T>
struct Traits {
typedef std::shared_ptr<A> Ptr;
};
class A
{
Traits<B>::Ptr foo();
};
class B
{
Traits<A>::Ptr bar();
};
如果A和B不共享相同的类型,您总是可以为所有类型专门化trait。
正如其他人注意到的那样,不能向前声明类型。这在一定程度上是因为类型定义本身并不是真正的"类型",而是其他类型的别名(因此c++ 11中有"类型别名"的等价概念,例如"using Int = Int;")。这意味着,例如,类型定义不会出现在ABI元素中,例如修改过的名称,因此编译器必须充分了解底层类型以满足所有ABI需求(包括如何修改类型名称)。
相关文章:
- 向前声明指向类的 typedef 指针
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何创建 typedef 结构的前向声明
- 格式为`int Typedef my_int;`的Typedef声明
- 无法转发声明C typedef结构-正在查找其他建议
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- 具有未声明/未定义类型的 typedef 结构
- 我们可以在声明中的任何位置放置"typedef"说明符吗?
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 错误:使用 tesseract 引擎时 C++ 中的声明'typedef struct tagBLOB BLOB'冲突
- typedef 应该同时在类定义和类声明中吗?
- 向前声明 typedef 保护
- "myStateType"未在此范围内声明,原因 #typedef
- 在 typedef 结构中声明一个数组
- 如何在包含 typedef 时用从右到左的规则解释变量声明
- C 迭代器从Typedef std :: Map作为模板参数声明
- C 使用声明,Typedef和数组类型
- 如何在C++标头中声明typedef
- 使用 FreeTDS 库时出现声明冲突的声明“typedef int RETCODE”错误
- 在c++类中向前声明typedef