gpt4 book ai didi

c++ - 在 STL 容器包装器中定义迭代器类型

转载 作者:太空狗 更新时间:2023-10-29 21:13:03 24 4
gpt4 key购买 nike

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

此外,您在 main() 代码中以错误的方式使用了 iterator。应该是这样的:

Wrapper<MyClass>::iterator it = wrapper.begin()

或者,在 C++ 11 或更高版本中,您可以这样做:

for(const auto &element : wrapper) {
...
}

就我个人而言,我更愿意使用私有(private)继承而不是封装。在我看来,公共(public)继承意味着“IS A”关系,而私有(private)继承意味着“IS IMPLEMENTED IN TERM OF”关系。

你可以这样做:

template<typename T>
class WrapperList : private List<T> {
... Your code that belongs to your wrapper
}

关于c++ - 在 STL 容器包装器中定义迭代器类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45644194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com