围绕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
}