如何在不复制数据的情况下将std::vector<const unsigned char>
转换为const std::vector<unsigned char>
?
Parser::Parser( const std::vector< unsigned char > &i_Data )
{
Parse(i_Data);
}
Parser::Parser( std::vector< const unsigned char > i_Data )
{
Parse( (std::vector< unsigned char >)(i_Data) ); // <-- Error
}
int Parser::Parse( const std::vector< unsigned char > &i_Data )
{ ... }
这是来自Visual C ++ 2010的错误消息:
错误C2440&#39;输入&#39; :无法转换为&#39; std :: vector&lt; _Ty&gt;&#39;至 &#39;的std ::矢量&lt;&_Ty GT;&#39;
答案 0 :(得分:4)
如何在不复制数据的情况下将
std::vector<const unsigned char>
转换为const std::vector<unsigned char>
?
你做不到。这两种类型是无关的。
不应该使用这样一个严格的接口(取std::vector< unsigned char > const&
),而应该将它概括为一对迭代器。在这种情况下,可能只有两个指向const unsigned char
的指针:
Parser(unsigned char const* begin, unsigned char const* end)
{
...
}
现在,如果您愿意,可以通过以下方式添加两个vector
构造函数来委托给这个构造函数:
Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }
注意:Pre-C ++ 11,因为vector
还没有data()
函数,将向量委托给两个指针的方法是编写类似的东西:
template <class T, class A>
T* data(std::vector<T, A>& v) {
return v.empty() ? 0 : &v[0];
}
template <class T, class A>
T const* data(std::vector<T, A> const& v) {
return v.empty() ? 0 : &v[0];
}
然后只需使用data(v)
。
答案 1 :(得分:0)
通过这个演员,它可以正确编译:
Parser::Parser( std::vector< const unsigned char > i_Data )
{
Parse( (std::vector< unsigned char >)(i_Data) ); // <-- Error
Parse( ( const std::vector< unsigned char > &)( i_Data ) ); // <-- OK
}
int Parser::Parse( const std::vector< unsigned char > &i_Data )
{ ... }