【发布时间】:2019-06-09 14:00:19
【问题描述】:
假设我有以下结构:
struct Parameter {
double value;
double error;
};
所以我通常使用该结构的向量(即std::vector<Parameter>),偶尔我想设置一个 values 的向量(但不是 errors) 为方便起见,使用带有标准 std::vector 的 operator= 在该参数向量中。
std::vector<Parameter> vector_of_parameters;
std::vector<double> vector_of values;
....
vector_of_parameters = vector_of_values;
为此,我正在尝试为此结构重载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;
}
但这会返回一个错误,指出 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;
}
现在的错误是 syntaxis with template,但我并没有真正看到或理解它,也不知道我还能做什么。
【问题讨论】:
-
您不能定义未在类中声明的类成员函数(如
operator=)(包含文件vector)。所以你需要写一个像void assign(std::vector<Parameter> &out, const std::vector<double> &in)这样的免费函数,或者更好地使用std::transform。 -
不确定,但您似乎认为结构与类有所不同。它们不是。C++ 只有可以使用
struct或class两个关键字中的任何一个声明的类,区别仅在于成员和基类的默认访问权限。 -
您不能为不属于您的类(例如 std::vector)重载赋值运算符。语言不允许这样做,但这并不重要;主要问题是它只是一个极其危险的想法(当然这正是语言不允许它的原因)。