重载operator = for std :: vector <>的struct成员

elc*_*ano 3 c++ struct vector

说我有以下结构:

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)

现在的错误是带有模板<>语法,但我没有真正看到它,或者理解它,并且不知道我还能做些什么.

Nat*_*ica 5

你不能重载赋值运算符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)