@communistic_sistema
Биохимик, но в программировании немного шарю

Как записать шаблонные операторы для массива и контейнера?

У меня есть класс, который хранит данные, я хочу написать оператор, что работает так: T[] + container.
Я думал реализовать 4 шаблона, по T(&&)[] по const T(&)[] по const container& по container&&, чтобы не создавались промежуточные объекты а сразу мог происходить std::move в container&& из T(&&)[]. При этом контейнер создавался и возвращался новый, если был передан const container&.
Но случилась ошибка С2666. Уже на стадии 2х шаблонов:
template<size_t N, typename T, typename U>
dynamic_array<T> operator +(const U (&array)[N],  const dynamic_array<T>& dyn_array);
template<size_t N, typename T,  typename U>
dynamic_array<T> operator +(U (&&array)[N], const dynamic_array<T>& dyn_array);

Ошибка была именно в записи:
dynamic_array<int> dyn_array = temp_class().i + dynamic_array<int>(temp_class().i);
при этом мне не совсем ясно, во что может происходить неявный каст. У меня предположения что оно использует template<size_t N> dynamic_array(T (&&array)[N]), который использует std::move, а затем пытается взять этот dynamic_array&& и сложить с другим dynamic_array<T>&&, который уже имеет свой оператор в классе: operator +(dynamic_array<T>&& dyn_array);
Я знаю о решении через запись operator+(array, container), но она мне кажется громоздкой. Если другие способы обхода данной проблемы?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
@communistic_sistema Автор вопроса
Биохимик, но в программировании немного шарю
Я нашел причину множественного определения.
temp_class() это rvalue, а вот temp_class().i это кто для компилятора? rvalue потому что буквально создается временный объект и его поля - тоже по сути временные? или lvalue потому что имеет имя?
ну вот std::move(temp_class().i) убирает непонятицу, статично кастуя к rvalue с явным указанием
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы