Почему я не могу перегрузить оператор =? - PullRequest
0 голосов
/ 11 декабря 2011

Я хочу, чтобы следующий код работал:

Mylist lst;
vector<int> v = lst;

Итак, я вижу, что мне нужно преобразовать мой список в вектор. Я попробовал этот код:

vector<int> operator=(vector<int> v, const List & l) {
    return v; // more profound stuff later :-)
}

(поместил его вне класса). к сожалению Visual Studio бросает меня: «Ошибка: оператор = должен быть функцией-членом» И я не понимаю - что мне делать? Я не могу поместить эту функцию в векторный класс ... Вы можете помочь мне с этим? Спасибо!

Ответы [ 5 ]

7 голосов
/ 11 декабря 2011

Вы можете перегрузить приведение вашего типа к любому другому типу (см. this и другие ресурсы, легко обнаруживаемые Google). Я думаю, что это то, что вам нужно здесь. Перегрузка оператора присваивания используется в C ++ совсем иначе.

3 голосов
/ 11 декабря 2011
Mylist lst;
vector<int> v = lst;

Это не вызывает operator= для начала. Это попытка вызвать конструктор вектора, который принимает аргумент типа Mylist. Поскольку такого конструктора не существует, выдается ошибка компиляции.

Что касается вопроса в заголовке, вы можете определенно перегрузить operator=, но это не может быть свободной функцией. Он должен быть членом класса.

3 голосов
/ 11 декабря 2011

Вы не можете перегрузить оператор для определенного класса за пределами этого класса.Я думаю, вектор - это std :: vector.Что вы могли бы сделать, так это добавить в свой метод класса "Mylist" метод toStdVector (), который бы возвращал std :: vector.

Например:

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

Mylist list;
std::vector<int> v(list.toStdVector());
2 голосов
/ 11 декабря 2011

сделать 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
1 голос
/ 11 декабря 2011

Вы можете указать operator vector<int> Так что, если вы поставите vector<int> v = lst;, будет вызван оператор vector` и оператор = для вектора будет разрешен.

class MyList {
public:

operator vector<int> () const
{
    return some_valid_vector;
}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...