Ваш тип myStruct
не имеет конструктора - ни одного, который вы объявили (потому что вы этого не сделали), и не тот, который компилятор синтезировал для вас (потому что он не знает, как это сделать).
Разумеется, можно создавать объекты этого типа с помощью агрегатной инициализации, которая является единственной возможностью, которую вы оставили для себя:
std::complex<double> x, y;
myStruct obj = {{}, x, y, 1, 2, 3};
Теперь вы должны иметь возможность копировать-создавать декуэлемент из него:
deq.push_back(obj);
Но вы не сможете использовать emplace_back
для конструирования на месте, пока тип не имеет конструктора.
Вы можете используйте emplace_back
для вызова синтезированного конструктора перемещения:
deq.emplace_back(std::move(obj));
, но вы все еще хотите иметь правильный конструктор для вашего типа.
Кроме того, поскольку myStruct
содержит const
члены, он не может быть назначен для копирования.По этой и по нескольким другим причинам тип не предназначен для использования в стандартном контейнере.
И я нервничаю по поводу хранения «сырых» ссылок внутри объекта, а затем помещаю этот объект в контейнер,Что обеспечивает достоверность этих ссылок?
Наконец, остановимся на ненужной идиоме typedef
.Это то, что мы делали в Си еще в 1820-х годах, чтобы мы могли вызывать тип myStruct
вместо struct myStruct
везде;в C ++ myStruct
- это класс, и вы можете просто назвать его напрямую, не прибегая к подобным хитростям.Иногда люди придерживаются трюка typedef
, когда их класс также должен быть включен в исходный код на C, то есть для совместимости, но с членами std::vector
и std::complex
вы наверняка этого не сделаете.