我创建了一个示例容器,它在内部存储在std::vector中。我希望能够用std::vector初始化容器。因此,我创建了一个构造函数,它采用std::initializer_list,还采用begin和end。
但我似乎不能这样初始化:
const std::vector< uint8_t > vec1 { 1,2,3,4,5 };
UsingVectorExample ex{ vec1.begin(), vec1.end() }; // compilation errors on this line
这里的问题是什么?我该怎么修复?
代码在这里:
#include <vector>
#include <cstdint>
class UsingVectorExample
{
public:
class iterator : public std::vector<uint8_t>::iterator
{
public:
explicit iterator(typename std::vector<uint8_t>::iterator c)
: std::vector<uint8_t>::iterator(c)
{}
};
class const_iterator : public std::vector<uint8_t>::const_iterator
{
public:
explicit const_iterator(typename std::vector<uint8_t>::const_iterator c)
: std::vector<uint8_t>::const_iterator(c)
{}
};
explicit UsingVectorExample(std::initializer_list<uint8_t> list)
: m_vector(list.size())
{
m_vector.assign(list);
}
UsingVectorExample(iterator begin, iterator end)
: m_vector(begin, end)
{}
UsingVectorExample(const_iterator begin, const_iterator end)
: m_vector(begin, end)
{}
iterator begin()
{
return iterator(m_vector.begin());
}
iterator end()
{
return iterator(m_vector.end());
}
const_iterator begin() const
{
return const_iterator(m_vector.begin());
}
const_iterator end() const
{
return const_iterator(m_vector.end());
}
void push_back(const uint8_t& val)
{
m_vector.push_back(val);
}
private:
std::vector<uint8_t> m_vector;
};
int main() {
const std::vector< uint8_t > vec1 { 1,2,3,4,5 };
UsingVectorExample ex{ vec1.begin(), vec1.end() }; // compilation errors on this line
}
这里的问题是迭代器构造器是explicit
。这意味着vec1.begin()
不能使用VectoreXample::Const_Iterator转换为,而不需要像下面这样显式地进行操作
UsingVectorExample ex{ UsingVectorExample::const_iterator{vec1.begin()},
UsingVectorExample::const_iterator{vec1.end()} };
要避免这样做,只需删除explicit
。您可以看到,在这个活生生的例子中