说我有以下结构:
struct Parameter {
double value;
double error;
};
Run Code Online (Sandbox Code Playgroud)
因此,我通常使用该结构的向量(即.std::vector<Parameter>),并且为了方便起见,我希望通过使用标准的std :: vector 在参数向量中设置值的向量(但不是错误).operator=.
std::vector<Parameter> vector_of_parameters;
std::vector<double> vector_of values;
....
vector_of_parameters = vector_of_values;
Run Code Online (Sandbox Code Playgroud)
为此,我正在尝试重载operator=此结构,如下所示:
std::vector<Parameter> operator=(const std::vector<double>& v) {
this->clear();
for (const auto& i:v) {
Parameter p;
p.value = i;
this->push_back(p);
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
但是这将返回一个错误,说std :: vector operator =(const std :: vector&v)必须是非静态成员.因此,如果我理解正确,我必须将其定义为运算符的成员函数:
std::vector<Parameter>::operator=(const std::vector<double>& v) {
this->clear();
for (const auto& i:v) {
Parameter p;
p.value = i;
this->push_back(p);
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
现在的错误是带有模板<>的语法,但我没有真正看到它,或者理解它,并且不知道我还能做些什么.
你不能重载赋值运算符std::vector. operator =必须是一个成员函数,你只是无法添加成员函数std::vector.
你可以做的是做一个方便的功能,就像create_parameters拿a std::vector<double>并返回一个std::vector<Parameter>.那看起来像
std::vector<Parameter> create_parameters(std::vector<double> const& params)
{
std::vector<Parameter> ret(params.size());
std::transform(params.begin(), params.end(), ret.begin(),
[](auto value) { return Parameter{value, 0}; });
return ret;
}
Run Code Online (Sandbox Code Playgroud)
然后
vector_of_parameters = vector_of_values;
Run Code Online (Sandbox Code Playgroud)
会成为
vector_of_parameters = create_parameters(vector_of_values);
Run Code Online (Sandbox Code Playgroud)