Если вы включите предупреждения, вы получите очень важный ключ к этой ошибке:
warning: unnecessary parentheses in declaration of 'v' [-Wparentheses]
46 | Reverse(v)
С точки зрения компилятора, v
- это имя объекта (паратезы игнорируются). Поскольку объект с именем v
уже существует, вы должны выбрать другое имя.
Предпочитать равномерную инициализацию, когда это возможно. Это не оставит места для неоднозначности.
Reverse{v};
Следующая проблема, с которой вы столкнетесь, заключается в том, что вы пытаетесь связать l-значение (вектор v
) со ссылкой на r-значение в конструкторе Reference
. Вы должны переместить вектор в этот объект, если хотите сохранить этот конструктор.
Reverse{std::move(v)};
Обратите внимание, что v
остается empty()
после этой операции. Данные хранятся только iterable_
сейчас.
Наконец, объект Reverse
является временным, и он отбрасывается сразу после создания. Возможно, вы захотите дать ему какое-то имя, чтобы использовать его в l oop позже (или создать временное на месте, как вы это делали в своем первом l oop).
Reverse myReverse {std::move(v)};
for(const auto& i : myReverse )
std::cout << i << " ";
//or
for(const auto& i : Reverse{std::move(v)} )
std::cout << i << " ";