繁体   English   中英

为什么不能重载operator =?

[英]Why can't I overload 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 ='必须是成员函数”。 而且我不明白-我该怎么办? 我不能将此函数放在向量类中……您能帮我这个忙吗? 谢谢!

您可以将类型的类型转换重载为任何其他类型(请参阅此内容以及Google可以轻松发现的其他资源)。 我认为这是您在这里需要的。 重载赋值运算符在C ++中用于另一件事。

您不能在此类之外的某些类中重载运算符。 我猜向量是std :: vector。 您可以做的是将“ Mylist”类方法添加到StdVector()const中,该方法将返回std :: vector。

例如:

class Mylist {
public:
  std::vector<int> toStdVector() const { ... }
};

Mylist list;
std::vector<int> v(list.toStdVector());
Mylist lst;
vector<int> v = lst;

开始时不会调用operator= 它尝试调用vector的构造函数,该构造函数采用Mylist类型的Mylist 由于不存在这样的构造函数,因此会产生编译错误。

至于标题中的问题,您绝对可以重载operator= ,但是它不能是自由函数。 它必须是班级的成员。

使MyList为第一个; std :: vector v = lst;

为了使上述工作就需要重载operator std::vector<int> ()或任何其他变量类型是与兼容std::vector<int> )在MyList ,请看下面的例子。

另一种方法是提供一个显式调用的方法,以返回对象的std::vector<int>version ”。 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

您可以提供operator vector<int>因此,如果将vector<int> v = lst;放在vector<int> v = lst; ,则将调用操作符vector`,并将允许vector的operator =。

class MyList {
public:

operator vector<int> () const
{
    return some_valid_vector;
}
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM