Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法基于STL迭代器编写自己的迭代器_C++_Templates_Stl_Iterator - Fatal编程技术网

C++ 无法基于STL迭代器编写自己的迭代器

C++ 无法基于STL迭代器编写自己的迭代器,c++,templates,stl,iterator,C++,Templates,Stl,Iterator,我在尝试实现基于链表的容器Set时遇到了一个小问题。 是的,我知道有一个集合的STL实现,但这是为了家庭作业。:) 这就是我到目前为止所做的: 我的Set.h文件如下所示: template <class T> class Set { private: typedef std::list<T> base_container; base_container items; public: class myIterator { public:

我在尝试实现基于链表的容器Set时遇到了一个小问题。 是的,我知道有一个集合的STL实现,但这是为了家庭作业。:)

这就是我到目前为止所做的:

我的Set.h文件如下所示:

template <class T>
class Set {
private:
    typedef std::list<T> base_container;
    base_container items;
public:
    class myIterator {
    public:
        typename base_container::iterator base_iterator;
        myIterator() { }
    };
    void addItem(const T item) {
        items.push_back(item);
    }
    typedef typename Set<T>::myIterator setIterator;
    setIterator begin() { return items.begin(); }
    setIterator end() { return items.end(); }
    Set<T>(void) { }
    ~Set<T>(void) { }
};
模板
类集{
私人:
typedef std::列出基本容器;
基本集装箱项目;
公众:
类迭代器{
公众:
typename base_容器::迭代器base_迭代器;
myIterator(){}
};
无效附加项(常数项){
项目。推回(项目);
}
typedef typename Set::myIterator setIterator;
setIterator begin(){返回项。begin();}
setIterator end(){return items.end();}
集合(空){}
~Set(void){}
};
现在,main.cpp:

#include "Set.h"

int main(void) {
    Set<int> mySet;

    mySet.addItem(1);
    mySet.addItem(2);
    mySet.addItem(3);
    mySet.addItem(4);

    Set<int>::myIterator x;
    x = mySet.begin();       // produces an error about non-convertible types.

    return EXIT_SUCCESS;
}
#包括“Set.h”
内部主(空){
设置mySet;
mySet.addItem(1);
mySet.addItem(2);
mySet.addItem(3);
mySet.addItem(4);
Set::my迭代器x;
x=mySet.begin();//生成关于不可转换类型的错误。
返回退出成功;
}
错误如下:

error C2664: 'Set<T>::myIterator::myIterator(const Set<T>::myIterator &)' : cannot convert parameter 1 from 'std::_List_iterator<_Mylist>' to 'const Set<T>::myIterator &' 
错误C2664:'Set::myIterator::myIterator(const Set::myIterator&'):无法将参数1从'std::_List_iterator'转换为'const Set::myIterator&'
显然我把事情搞砸了,但我不确定代码的哪一部分是真正的问题。 关于如何解决这个问题有什么建议吗?如有任何有用的信息,将不胜感激


谢谢。:)

您可以从
std::iterator
派生并提供适当的iterator类别标记。这将自动为迭代器提供所需的嵌套类型,例如
value\u type
中的
T
。您仍然需要编写函数成员,例如
operator++
operator*
(取决于您的迭代器类别,例如,对于随机访问迭代器,您还需要
operator[]

您可以从
std::iterator
派生并提供适当的迭代器类别标记。这将自动为迭代器提供所需的嵌套类型,例如
value\u type
中的
T
。您仍然需要编写函数成员,例如
operator++
operator*
(取决于您的迭代器类别,例如,对于随机访问迭代器,您还需要
operator[]

问题在于:

setIterator begin() { return items.begin(); }
setIterator end() { return items.end(); }
您试图返回的值的类型错误。它们属于
base\u iterator
类型,而不是
setIterator
,无法将前者隐式转换为后者。

问题在于:

setIterator begin() { return items.begin(); }
setIterator end() { return items.end(); }

您试图返回的值的类型错误。它们属于
base\u iterator
类型,而不是
setIterator
,无法将前者隐式转换为后者。

您的方法存在许多问题

正如其他人所说,您不能从基础类型创建迭代器类型:

setIterator begin() { return items.begin(); }
setIterator end() { return items.end(); }
这可以通过向类型添加构造函数来解决:

class myIterator {
    typedef typename base_container::iterator base_iterator_type;
public:
    explicit myIterator(base_iterator_type i) : base_iterator(i) { }
    base_iterator_type base_iterator;
    myIterator() { }
};
此构造函数应该是显式的,这意味着您需要更改创建它的方式:

setIterator begin() { return setIterator(items.begin()); }
下一个问题是,您的类型没有实现迭代器接口,它没有提供
运算符+++
运算符*
等,并且它没有定义嵌套类型,例如
值\u类型
迭代器\u类别
,也就是说,它不是迭代器(只是给它起一个名字,里面有“迭代器”并不能使它成为真!)


一旦您解决了这个问题,并且您的类型是一个有效的迭代器,您就会发现您的容器不能与STL样式的算法一起使用,因为它没有实现容器需求。除此之外,它应该提供一个名为
iterator
而不是
setIterator
的嵌套类型,以便其他模板代码可以使用
S::iterator
,而不必关心
S
std::set
还是
set
。不要叫它
Set::setIterator
,只要叫它
Set::iterator
。同样,在这种情况下,定义
myIterator
(没人关心它是你的!:-)然后用typedef来调用它
setIterator
,只需首先用正确的名称命名类型,就不需要typedef了。

你的方法有很多问题

正如其他人所说,您不能从基础类型创建迭代器类型:

setIterator begin() { return items.begin(); }
setIterator end() { return items.end(); }
这可以通过向类型添加构造函数来解决:

class myIterator {
    typedef typename base_container::iterator base_iterator_type;
public:
    explicit myIterator(base_iterator_type i) : base_iterator(i) { }
    base_iterator_type base_iterator;
    myIterator() { }
};
此构造函数应该是显式的,这意味着您需要更改创建它的方式:

setIterator begin() { return setIterator(items.begin()); }
下一个问题是,您的类型没有实现迭代器接口,它没有提供
运算符+++
运算符*
等,并且它没有定义嵌套类型,例如
值\u类型
迭代器\u类别
,也就是说,它不是迭代器(只是给它起一个名字,里面有“迭代器”并不能使它成为真!)


一旦您解决了这个问题,并且您的类型是一个有效的迭代器,您就会发现您的容器不能与STL样式的算法一起使用,因为它没有实现容器需求。除此之外,它应该提供一个名为
iterator
而不是
setIterator
的嵌套类型,以便其他模板代码可以使用
S::iterator
,而不必关心
S
std::set
还是
set
。不要叫它
Set::setIterator
,只要叫它
Set::iterator
。同样在这种情况下,定义
myIterator
(没人关心它是你的!:-)然后用typedef来调用它
setIterator
,只需在第一个位置用正确的名称命名类型,你就不需要typedef了。

这将有助于查看错误消息哦,是的,当然,抱歉:错误C2664:“Set::myIterator::myIterator(const Set::myIterator&”):无法将参数1从“std::_List_iterator”转换为“const Set::myIterator&”。查看