我试图将此传递给我的项目的另一部分,要求它是一个向量
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*>'
答案 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指定执行重载决策 对于本节中的规则,重载决策选择了 构造函数分两个阶段:
- 的初始化列表构造函数(8.5.4)
最初,候选函数是类
T
[...]如果找不到可行的初始化列表构造函数,则再次执行重载解析,其中 候选函数是类
T
的所有构造函数,参数列表由元素组成 初始化列表。
现在,是否有可行的初始化列表构造函数? [over.ics.list]:
- 否则,如果参数类型为
醇>std::initializer_list<X>
,则可以隐式转换初始化列表的所有元素 至X
,[..]10.除上述列举的所有情况外,无法转换。
显然没有从unsigned char*
到unsigned char
的隐式转换,因此选择了迭代器对构造函数模板。 Demo
答案 1 :(得分:0)
可能没有直接回答答案。
但问题是为什么在使用std::string
或std::basic_string<unsigned char>
代替std :: vector时使用向量,如下所示:
unsigned char a[]="1234";
std::basic_string<unsigned char> v=a;