【问题标题】:Forward declare typedef within C++ class在 C++ 类中前向声明 typedef
【发布时间】:2013-06-02 17:35:06
【问题描述】:

在类中转发声明 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();

但是有更优雅的解决方案吗?

【问题讨论】:

  • IMO 你很乐意在第 3 行周围执行 typedef,至少其中一个。或者使用另一个 typedef 并稍后使用 static_assert 和 is_same_type 检查以确保一致性。

标签: c++ typedef declaration forward


【解决方案1】:

不幸的是,没有向前声明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;

这应该有望实现您的目标。

【讨论】:

  • 我以前也想要。
【解决方案2】:

您面临两个明显的困难: 1.没有typedef的前向声明 2.嵌套类型的前向声明是不可能的

没有办法绕过第二个:您必须取消嵌套类型。

我偶尔使用的第一种方法是创建派生类型,是的,可以前向声明。

说:

struct Ptr : shared_ptr<A> {};

这是一个新类型,但它几乎与同义词相同。 当然,问题在于构造函数,但使用 C++11 会变得更好。

这个答案当然是笼统的。对于您的具体情况,我认为您应该在类之外定义 Ptrs,您完全没有问题。

struct A;
struct B;
typedef shared_ptr<A> APtr;
typedef shared_ptr<B> BPtr;

然后是课程。

【讨论】:

    【解决方案3】:

    也没有办法转发声明

    1. 一个typedef
    2. 另一个类中的名称

    所以 - 你不能转发声明 typedef,如果可以,你仍然不能这样做,因为你需要这样做:

    class B::Ptr;
    

    这是不可能的

    【讨论】:

      【解决方案4】:

      你不能。

      但是你可以解耦类的 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 不共享相同的类型,您始终可以为所有类型专门化 Traits。

      【讨论】:

        【解决方案5】:

        正如其他人所指出的,您不能前向声明 typedef。这部分是因为 typedef 并不是它们自己的真正“类型”,而是其他类型的别名(因此 C++11 的“类型别名”等价概念,例如“使用 Int = int;”)。这意味着,例如,typedef 不会出现在 ABI 元素中,例如重命名的名称,因此编译器确实必须知道足够的底层类型才能满足所有 ABI 要求(包括如何重整类型名称)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          • 2016-06-19
          • 2016-12-17
          • 2023-03-12
          相关资源
          最近更新 更多