【发布时间】:2013-09-11 09:42:42
【问题描述】:
我希望构造函数接受任何具有 x 特征和引用类 y 的迭代器。
Class(std::iterator<std::random_access_iterator_tag, MyClass*> it);
但是当我尝试传递这样的迭代器时,编译失败并显示Candidate constructor not viable: no known conversion from 'iterator' (aka '__deque_iterator<value_type, pointer, reference, __map_pointer, difference_type, __block_size>') to 'std::iterator<std::random_access_iterator_tag, MyClass *>'。
插入代码:
std::deque<MyClass*> collection_with_random_access_iterator{};
Class tmp(collection_with_random_access_iterator.begin());
我可以在这里做什么?
【问题讨论】:
-
值得注意的是,您收到错误是因为(至少在您的实现中)
deque<T>::iterator不继承自iterator<random_access_iterator_tag, T>(标准不要求它这样做)。 (顺便说一句,MyClass**也是MyClass*的一种“随机访问迭代器”(例如vector<MyClass*>::iterator就是这样),但不能从任何东西派生原始指针。) -
虽然我们来了.. std::iterator 不是多态的,它只是一个帮助器基类,用于简化迭代器定义。它不应该那样使用。
-
@sbabbi 是的,感谢您指出这一点。从便利结构
std::iterator继承,即使是公开的,也只是一个实现细节。 -
@gx_ 遗憾的是,c++ 标准不要求标准集合的
iterators来自一个共同的父集合。 -
@AdamS 指针有资格作为随机访问迭代器,
vector<T>::iterator和basic_string<T>::iterator可以是T *。无论如何,继承无关紧要。您不想使用虚函数来取消引用迭代器。
标签: c++ c++11 polymorphism