我想让以下代码工作:
Mylist lst;
vector<int> v = lst;
所以我看到我需要将列表转换为矢量。 我试过这段代码:
vector<int> operator=(vector<int> v, const List & l) {
return v; // more profound stuff later :-)
}
(把它放在课外)。不幸的是Visual Studio抛出了我:“错误:'operator ='必须是成员函数”。 我不明白 - 我该怎么办?我不能把这个函数放在vector类中... 你可以帮帮我吗? 谢谢!
答案 0 :(得分:7)
您可以将类型的广告素材重载为任何其他类型(请参阅this以及Google可轻松发现的其他资源)。我想这就是你需要的。重载赋值运算符在C ++中用于另一件事。
答案 1 :(得分:3)
您不能为此类之外的某些类重载运算符。我猜矢量是std :: vector。你可以做的是添加到你的“Mylist”类方法toStdVector()const,它将返回std :: vector。
例如:
class Mylist {
public:
std::vector<int> toStdVector() const { ... }
};
Mylist list;
std::vector<int> v(list.toStdVector());
答案 2 :(得分:3)
Mylist lst;
vector<int> v = lst;
这不会以operator=
开头。它试图调用vector的构造函数,该构造函数接受类型为Mylist
的参数。由于不存在这样的构造函数,因此会出现编译错误。
至于标题中的问题,你绝对可以重载operator=
,但它不能是一个自由函数。它必须是一个班级的成员。
答案 3 :(得分:2)
制作 MyList lst; std :: vector v = lst;
要完成上述工作,您需要在operator std::vector<int> ()
中重载std::vector<int>
(或与MyList
兼容的任何其他变量类型),请参阅以下示例。
另一种方法是提供一种显式调用以返回对象的std::vector<int>
“版本”的方法。 std::vector<int> v = obj.to_int_vector ()
,它与以下示例中的实现几乎相同。
示例强>
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
struct Obj {
operator std::vector<int> () const {
return std::vector<int> (data, data+3);
}
int data[3];
};
int
main (int argc, char *argv[])
{
Obj o;
o.data[0] = -1;
o.data[1] = 2;
o.data[2] = 99;
std::vector<int> v = o;
std::copy (v.begin (), v.end (), std::ostream_iterator<int> (std::cout, " "));
}
输出:
-1 2 99
答案 4 :(得分:1)
您可以提供operator vector<int>
因此,如果您放置vector<int> v = lst;
,将调用运算符向量`并且将允许operator = for vector。
class MyList {
public:
operator vector<int> () const
{
return some_valid_vector;
}
};