![](/img/trans.png)
[英]Cast const std::vector<char> to unsigned char*?
[英]How can I cast an std::vector<const unsigned char> to a const std::vector<unsigned char>?
如何在不复制数据的情况下将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'类型转换':无法从'std :: vector <_Ty>'转换为'std :: vector <_Ty>'
如何在不复制数据的情况下将
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
构造函数以委托给该vector
构造函数:
Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }
注意:在C ++ 11之前的版本中,由于vector
尚没有data()
函数,因此将vector委托给两个指针的方法是编写如下内容:
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)
代替。
使用此强制转换,它可以正确编译:
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 )
{ ... }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.