Могу ли я создать std :: vector структуры без предварительного определения структуры? - PullRequest
0 голосов
/ 06 января 2019

Вместо:

struct MyStruct{
    ...
};

std::vector<MyStruct> myVec;

Могу ли я сделать что-то вроде:

std::vector<struct MyStruct {...}> myVec;

или даже, поскольку мне не нужно имя для этой структуры, поскольку я использую его только внутри этого вектора:

std::vector<struct {...}> myVec?

Я использую C ++ уже много лет и не думаю, что это возможно. Я думаю, что было бы хорошо, хотя ...

Или есть способ?

Ответы [ 3 ]

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

Последнее, что я проверил, любой тип, хранящийся в стандартном контейнере (не знаю, почему вы ссылаетесь на STL, который похож, но отличается и в любом случае неоднозначный!) Должен быть завершен. Объявленный тип (forwand-) не завершен. Если вы хотите знать, проверьте стандартную версию, которую вы используете, или хотя бы упомяните это здесь.

Относительно встроенного объявления структуры в параметре шаблона, например, g++ говорит, что "типы не могут быть определены в аргументах шаблона", когда я пытаюсь это сделать. Я не могу дать вам убедительную причину, почему это не должно работать. В конце концов, все контейнеры предоставляют псевдоним element_type и auto из C ++ 11, что не должно быть проблемой в целом.

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

Оба предыдущих ответа верны - вы не можете определить вектор чего-то неполного типа.

Однако вы можете объявить один - с требованием, чтобы при его определении тип был завершен.

struct Foo; // forward declaration
using FooV = std::vector<Foo>; // declaration

struct Foo { int val; }; // definition
FooV v; // define a vector - all is well.
0 голосов
/ 06 января 2019

Нет , вы не можете сделать это, когда объявляете фактическую переменную или тип, так как C ++ является статически типизированным языком. Конструкция C ++, допускающая общие типы, - это шаблоны, т. Е.

template<typename T>
using myVec = std::vector<T>;

, который вы можете использовать напрямую, например

struct someStruct { /* ... */ };
myVec<someStruct> foo;

или в некотором коде шаблона

template<typename T>
T bar(myVec<T> const&vec)
{
    /* ... */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...