为什么我不能重载operator =?

时间:2011-12-11 15:25:46

标签: c++ operator-overloading operator-keyword implicit-conversion assignment-operator

我想让以下代码工作:

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类中... 你可以帮帮我吗? 谢谢!

5 个答案:

答案 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;
}
};