我可以先创建结构的std :: vector而不先定义结构吗?

时间:2019-01-06 11:34:41

标签: c++ stl

代替:

struct MyStruct{
    ...
};

std::vector<MyStruct> myVec;

我可以做类似的事情吗?

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

甚至,因为我不需要此结构的名称,因为我仅在此向量内使用它:

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

我使用C ++已经很多年了,我认为这是不可能的。我认为那会很好...

还是有办法?

3 个答案:

答案 0 :(得分:0)

最后,我检查了标准容器中存储的任何类型(不知道为什么您引用STL,这是相似但有所不同,并且在任何情况下都是模棱两可的!)。 (强制)声明的类型不完整。如果您想知道,请检查您所使用版本的标准,或者至少在此处提及。

关于模板参数中结构的内联声明,例如尝试时,g++说“类型可能未在模板参数中定义”。我不能给您一个令人信服的理由,为什么它不起作用。毕竟,所有容器都提供一个element_type别名,并且使用C ++ 11中的auto通常不会出现问题。

答案 1 :(得分:0)

以上两个答案都是正确的-您不能定义不完整类型的向量。

但是,您可以声明一个-要求在定义它时,类型必须完整。

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

struct Foo { int val; }; // definition
FooV v; // define a vector - all is well.

答案 2 :(得分:-2)

,在声明实际变量或类型时不能这样做,因为C ++是静态类型的语言。允许通用类型的C ++构造是模板,即

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

可以直接使用,例如

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

或使用某些模板代码

template<typename T>
T bar(myVec<T> const&vec)
{
    /* ... */
}