如何将unsigned char []转换为std :: vector <unsigned char =“”> </unsigned>

时间:2015-01-14 20:09:23

标签: c++

我试图将此传递给我的项目的另一部分,要求它是一个向量

unsigned char vch[65];

unsigned int size() const { return GetLen(vch[0]); }
const unsigned char* begin() const { return vch; }
const unsigned char* end() const { return vch + size(); 


std::vector<unsigned char> Raw() const
{
        return (vch, vch + size());
}

我收到错误

 could not convert '(const unsigned char*)(&((const CPubKey*)this)-
CPubKey::vch)' from 'const unsigned char*' to 'std::vector<unsigned char*>'

2 个答案:

答案 0 :(得分:11)

return (vch, vch + size());

这使用逗号运算符 - 长话短说,写

return std::vector<unsigned char>(vch, vch + size());

std::vector<unsigned char> vec(vch, vch + size())
return vec;

代替。 (后者在语义上是等效的,但在可读性方面更可取) 或者使用C ++ 11:

return {vch, vch + size()};

这确实有效,因为带有指针的braced-init-list无法转换为initializer_list<unsigned char>。 [over.match.list] / 1:

  

当非聚合类类型T的对象被列表初始化时   8.5.4指定执行重载决策   对于本节中的规则,重载决策选择了   构造函数分两个阶段:

     
      
  • 最初,候选函数是类T [...]

  • 的初始化列表构造函数(8.5.4)   
  • 如果找不到可行的初始化列表构造函数,则再次执行重载解析,其中      候选函数是类T的所有构造函数,参数列表由元素组成     初始化列表。

  •   

现在,是否有可行的初始化列表构造函数? [over.ics.list]:

  
      
  1. 否则,如果参数类型为std::initializer_list<X> ,则可以隐式转换初始化列表的所有元素   至X ,[..]
  2.         

    10.除上述列举的所有情况外,无法转换。

显然没有从unsigned char*unsigned char的隐式转换,因此选择了迭代器对构造函数模板。 Demo

答案 1 :(得分:0)

可能没有直接回答答案。

但问题是为什么在使用std::stringstd::basic_string<unsigned char>代替std :: vector时使用向量,如下所示:

unsigned char a[]="1234";
std::basic_string<unsigned char> v=a;