C++ 如何投射std::vector<;常量无符号字符>;到常量std::vector<;无符号字符>;?

C++ 如何投射std::vector<;常量无符号字符>;到常量std::vector<;无符号字符>;?,c++,casting,C++,Casting,在不复制数据的情况下,如何将std::vector强制转换为const std::vector 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 ch

在不复制数据的情况下,如何将
std::vector
强制转换为
const std::vector

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 )
{ ... }
Parser::Parser(const std::vector&i_数据)
{
解析(i_数据);
}
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));/&i_数据)
{ ... }

这是VisualC++ 2010中的错误信息:

错误C2440“类型转换”:无法从“std::vector”转换为 “std::vector”

在不复制数据的情况下,如何将
std::vector
强制转换为
const std::vector

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 )
{ ... }
你不能。这两种类型是不相关的

不要有这样一个严格的接口(使用
std::vectorconst&
),您应该将它概括为使用一对迭代器。在这种情况下,可能只需要指向
const unsigned char
的两个指针:

Parser(unsigned char const* begin, unsigned char const* end)
{
    ...
}
现在,如果需要,您可以添加两个
向量
构造函数,通过以下方式委托给此构造函数:

Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }
然后简单地使用
数据(v)

在不复制数据的情况下,如何将
std::vector
强制转换为
const std::vector

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 )
{ ... }
你不能。这两种类型是不相关的

不要有这样一个严格的接口(使用
std::vectorconst&
),您应该将它概括为使用一对迭代器。在这种情况下,可能只需要指向
const unsigned char
的两个指针:

Parser(unsigned char const* begin, unsigned char const* end)
{
    ...
}
现在,如果需要,您可以添加两个
向量
构造函数,通过以下方式委托给此构造函数:

Parser(std::vector<unsigned char> const& v)
: Parser(v.data(), v.data + v.size())
{ }

然后只需使用
数据(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 )
{ ... }
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));//&(i_数据));//&i_数据)
{ ... }

使用此强制转换,它可以正确编译:

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 )
{ ... }
Parser::Parser(std::vectori_数据)
{
解析((std::vector)(i_数据));//&(i_数据));//&i_数据)
{ ... }

我假设您试图避免复制数据。对吗?@NathanOliver:对。您应该休息一下,想想为什么要这样做。
std::vector
是未定义的行为。@NathanOliver在C++03中,容器元素要求是
可分配的
;在C++11及更高版本中,分配器要求orbid
const
值类型。我假设您试图避免复制数据。是否正确?@NathanOliver:正确。您应该休息一下,想想为什么要这样做。
std::vector
无论如何都是未定义的行为。@NathanOliver在C++03中,容器元素必须是
可赋值的;在C++11和l中此外,分配器要求禁止
const
值类型。不确定VS2010是否有委托构造函数。但无论如何,它们都是委托给成员函数,所以这不是一个大问题。此外,将
end
作为指针有点棘手。@T.C.
data()
data()+size()
?是的。“有点棘手”部分原因是有人可能会尝试
&*end()
vector
没有
数据()
直到C++11,我不知道VS2010中有多少C++11。不确定VS2010是否有委托构造函数。但他们无论如何都在委托给成员函数,所以这不是一个大问题。另外,将
end
作为指针有点棘手。@t.C.
data()
data()+size()
?是的。“有点棘手”部分原因是有人可能会尝试
&*end()
vector
直到C++11才有
数据()
,我不知道VS2010中有多少C++11。