我有一个容器类,它的实现隐藏在Pimpl习语中。
问题是:如何将实现类中定义的typedef公开到公共类?另外,我想确保实现细节不会在typedef中公开(我们不应该看到它是一个向量)。
下面的代码在编译期间抱怨说MyContainer::Impl
是一个不完整的类型。我似乎无法找到任何解决方法。
我偶然发现How can I expose iterators without exposing the container used?指向article about type erasures的类似问题,但我不确定是否可以将所有这些阅读应用到我需要的内容中?
我正在使用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();
}