围绕STL容器(也是模板)(可以接受泛型T作为元素)编写包装器类的正确方法是什么,并允许我像直接使用STL容器那样使用迭代器?

我想做以下事情

#include <list>
#include <iostream>

class MyClass{};

template<class T>
class Wrapper
{
    public:
        typename std::list<T>::iterator iterator;

        std::list<T> elements;
        iterator begin(){ return elements.begin(); };
        iterator end(){ return elements.end(); };
};

int main()
{
    Wrapper<MyClass> wrapper;

    for (Wrapper::iterator it = wrapper.begin(); it != wrapper.end(); ++it)
        std::cout<<"Hi"<<std::endl;
}

但是编译器说:
 error: ‘iterator’ in ‘class Wrapper<T>’ does not name a type

最佳答案

您有两个错误。

就像Igor Tandetnik在评论中说的那样,您的iterator是数据成员,而不是案例的嵌套类型。

您必须在类里面这样做:

typedef typename std::list<T>::iterator iterator;

或者,在C++ 11中:
using iterator = typename std::list<T>::iterator;

另外,您在iterator代码中使用main()的方式错误。应该是这样的:
Wrapper<MyClass>::iterator it = wrapper.begin()

或者,在C++ 11或更高版本中,您可以执行以下操作:
for(const auto &element : wrapper) {
    ...
}

就个人而言,我宁愿使用私有(private)继承而不是封装。在我看来,公共(public)继承意味着“IS A”关系,而私有(private)继承意味着“在条款中实现”关系。

您可以这样做:
template<typename T>
class WrapperList : private List<T> {
    ... Your code that belongs to your wrapper
}

09-06 05:37