C++ 将实现类中定义的typedef公开到公共类中

C++ 将实现类中定义的typedef公开到公共类中,c++,c++11,typedef,pimpl-idiom,C++,C++11,Typedef,Pimpl Idiom,我有一个容器类,它的实现通过Pimpl习惯用法隐藏 问题是:如何将实现类中定义的typedef公开到公共类中?另外,我希望确保实现细节不会在typedef中公开(我们不应该看到它是一个向量) 下面的代码在编译过程中抱怨说MyContainer::Impl是一个不完整的类型。我似乎找不到任何解决办法 我在指出一个问题时偶然发现了一个类似的问题,但我不确定我是否能将所有这些阅读应用到我需要的东西上 我正在使用C++11 class MyContainer { private: class Imp

我有一个容器类,它的实现通过Pimpl习惯用法隐藏

问题是:如何将实现类中定义的typedef公开到公共类中?另外,我希望确保实现细节不会在typedef中公开(我们不应该看到它是一个向量)

下面的代码在编译过程中抱怨说
MyContainer::Impl
是一个不完整的类型。我似乎找不到任何解决办法

我在指出一个问题时偶然发现了一个类似的问题,但我不确定我是否能将所有这些阅读应用到我需要的东西上

我正在使用C++11

class MyContainer
{
private:
  class Impl;
  std::unique_ptr<Impl> m_d;

public:
  typedef Impl::Iterator Iterator;
  //typedef std::vector<int>::iterator Iterator; //< No!

  MyContainer() = default;
  ~MyContainer() = default;
  Iterator begin();
};


class MyContainer::Impl
{
public:
  typedef std::vector<int>::iterator Iterator;

  Impl() = default;
  ~Impl() = default;

  std::vector<int> items;
};


MyContainer::Iterator MyContainer::begin()
{
  return m_d->items.begin();
}
class MyContainer
{
私人:
类Impl;
std::唯一的\u ptr m\u d;
公众:
typedef Impl::迭代器迭代器;
//typedef std::vector::iterator iterator;//items.begin();
}

这不是部分地违背了隐藏实现的目的吗?我不这么认为?从头文件中可以明显看出,
MyContainer
指向一个
MyContainer::Impl
实现,因此我不确定从那里转发typedef会有什么危害?无论如何,我愿意接受建议。如果typedef取决于实现,那么您正在泄漏详细信息。如果没有,则可以将指向不完整类型的指针替换为指向完整抽象类的指针。这个抽象类可以定义typedef。将您自己的随机访问迭代器公开到一个连续的缓冲区中,或者将原始指针公开为迭代器,或者(低效)公开类型擦除迭代器。为了高效地使用,客户机代码在使用类型的值时需要了解很多关于类型的信息。类型擦除(另一个pimpl级别,但在迭代器中)可以让您在需要时对客户端隐藏详细信息。即使您找到了公开此typedef的方法,您将如何在类外使用它?对于任何“用户”代码来说,它仍然是一个不完整的类型,除非您在其中包含了您的实现细节。因此,我认为隐藏迭代器类没有任何意义:它是公共接口的一部分。当然,除非您想动态地分配迭代器,并在owner类中使用一些特殊的操作方法将它们作为不透明对象使用——但这对我来说似乎不是一个好主意。