Как перегрузить std :: vector :: operator = () - PullRequest
0 голосов
/ 08 января 2019

Мне нужно присвоить тип std :: vector = arma :: vec, то есть назначить вектор из математической библиотеки броненосца в std :: vector.

template <typename T>
std::vector<T>& std::vector<T>::operator=(arma::vec right) {
  std::size_t s(right.size());
  this->resize(s);
  for (std::size_t i = 0; i < s; i++)
    *this[i] = right(i);
  return *this;
}

Я пробовал таким образом, но компилятор не согласен: error: invalid use of incomplete type ‘class std::vector<_RealType>’

Возможно ли перегрузить оператор присваивания для класса std :: vector?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Очки для рассмотрения:

  1. operator= может быть перегружено только как функция-член.
  2. Определение операторной функции таким способом, как у вас, невозможно, если функция не объявлена ​​как функция-член класса.
  3. Существуют простые способы назначения arma::vec. Используйте их вместо попытки определить перегрузку oprator=.

Пример кода, демонстрирующий, как вы можете назначать различные типы контейнеров для std::vector.

#include <iostream>
#include <vector>
#include <set>

int main()
{
   std::vector<int> a;
   int b[] = {1, 2, 3, 4, 5};
   std::set<int> c{10, 20, 30, 40, 50};

   a = {std::begin(b), std::end(b)};

   for ( int el : a )
   {
      std::cout << el << " ";
   }

   std::cout << std::endl;

   a.assign(std::begin(c), std::end(c));

   for ( int el : a )
   {
      std::cout << el << " ";
   }

   std::cout << std::endl;
}

В вашем случае вы можете использовать одно из следующих:

std::vector<YourType> v;
v = {std::begin(right), std::end(right)};
v.assign(std::begin(right), std::end(right));
0 голосов
/ 08 января 2019

Нет, это невозможно сделать. Это даже неопределенное поведение, если вы расширяете пространство имен std, если это явно не разрешено стандартом для этих символов. Тем не менее, я не вижу, чтобы компилятор помещал ресурсы для отслеживания этого. Однако он может конфликтовать с уже используемыми символами.

В известных мне реализациях STL многие функции реализованы в базовых классах с неопределенными именами.

Существует что-то вроде оператора приведения: operator std::vector<int>() const Это должно быть добавлено к типу, который должен быть преобразован. Однако, так как это тоже часть библиотеки, я не думаю, что у вас есть допустимые опции.

...