我创建了一个示例容器,它内部存储在 std::vector 中。我希望能够使用 std::vector 初始化容器。因此,我创建了采用 std::initializer_list 并采用开始和结束的构造函数。
但我似乎无法像这样初始化:
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()
如果UsingVectorExample::const_iterator
没有你明确地这样做,就不能转换为 a
UsingVectorExample ex{ UsingVectorExample::const_iterator{vec1.begin()},
UsingVectorExample::const_iterator{vec1.end()} };
不必这样做,只需删除explicit
. 你可以看到在这个活生生的例子中工作
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句