如何将std :: vector <const unsigned =“”char =“”>转换为const std :: vector <unsigned char =“”>?

时间:2016-05-16 16:41:29

标签: c++ casting

如何在不复制数据的情况下将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;

2 个答案:

答案 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 )
{ ... }