Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哪些存储了不完整类型的STL数据结构可以用作类成员?_C++_Stl_C++17_Standards_Forward Declaration - Fatal编程技术网

C++ 哪些存储了不完整类型的STL数据结构可以用作类成员?

C++ 哪些存储了不完整类型的STL数据结构可以用作类成员?,c++,stl,c++17,standards,forward-declaration,C++,Stl,C++17,Standards,Forward Declaration,据我所知,由于C++17,一些STL数据结构可能“存在”,并以不完整的类型作为模板参数来描述存储的类型。例如,如果类的所有属性(需要不完整的定义)都在一个单独的.cpp文件中实现,我可以使用std::unique\u ptr(我不确定它是否是一个数据结构)或std::vector作为类成员: class Incomplete; using Complete = int; class Foo { private: std::unique_ptr<Incomplete> u_p;

据我所知,由于C++17,一些STL数据结构可能“存在”,并以不完整的类型作为模板参数来描述存储的类型。例如,如果类的所有属性(需要
不完整的
定义)都在一个单独的.cpp文件中实现,我可以使用
std::unique\u ptr
(我不确定它是否是一个数据结构)或
std::vector
作为类成员:

class Incomplete;
using Complete = int;
class Foo {
private:
  std::unique_ptr<Incomplete> u_p;
  std::vector<Incomplete> v;
  std::deque<Incomplete> d;
  std::list<Incomplete> l;
  std::set<Incomplete> s;
  std::unordered_map<Complete, Complete> u_m_cc;
  std::unordered_map<Complete, Incomplete> u_m_ci;
  std::unordered_map<Incomplete, Complete> u_m_ic;
  std::unordered_map<Incomplete, Incomplete> u_m_ii;
public:
  // implemented in a separate .cpp which has Incomplete defined:
  Foo();
  Foo(Foo&&);
  Foo& operator=(Foo&&);
  Foo(Foo const&);
  Foo& operator=(Foo const&);
  ~Foo();
};
类不完整;
使用Complete=int;
福班{
私人:
std::唯一的\u ptr u\p;
std::向量v;
std::德克d;
std::列表l;
std::集s;
std::无序地图u_m_cc;
std::无序地图u_m_ci;
std::无序地图u u m u ic;
std::无序地图u_m_ii;
公众:
//在单独的.cpp中实施,该.cpp定义不完整:
Foo();
Foo(Foo&&);
Foo&运算符=(Foo&&);
Foo(Foo const&);
Foo&运算符=(Foo常量&);
~Foo();
};
那么,上面列出的哪些数据成员对这种用法有效?其他数据结构、智能指针等呢

由于C++17,一些STL数据结构可能“存在”,而不完整的类型作为描述存储类型的模板参数

这是不正确的

自C++17以来,某些STL类型可能会声明为不完整类型作为模板参数

当类型被实例化时,类型必须是完整的

例如:(未测试的代码)

struct;//残缺的
使用TV=std::vector;//使用不完整的类型T声明了一个类型;好的
电视tv0;//尝试声明TV类型的变量;无法编译。
结构T{int v;};//T现在完成了
电视1;//汇编

假设在类型完成之前没有显式或隐式使用任何类成员:

自C++11以来,
std::unique_ptr
std::shared_ptr
的模板参数始终可能不完整,请分别参见和

在C++17中添加了对容器中不完整类型的支持,但仅针对

std::vector
std::list
std::forward_list
仅当所使用的分配器满足分配器完整性要求时,即,即使值类型本身不完整,分配器类型
X
本身也是完整类型,
std::allocator\u traits
的所有成员也是完整类型,除了
::value\u type
。默认分配器
std::allocator
满足这些要求


其他容器都不能用于不完整的类型。根据上面链接的建议,“作为第一步”,范围仅限于这三个容器,因为主要的实现已经支持它。

它是否编译?如果没有,哪些成员会产生诊断消息?@eerorika
std::vector
std::unique\u ptr
都很好,
std::unordered\u map
拒绝在我的MSVC上工作:“std::pair使用不完整的结构”。即使它确实编译了一些东西,也不能保证它在标准中,这就是我在此类测试中看到的问题。在堆上分配的STL容器将处理不完整的类型。在堆栈上分配的文件将不会,并且需要包含适当的头文件
std::pair
是一个POD,因此任何包含
std::pair
作为成员的容器都不能处理不完整的类型。一个有趣的例外是
union
,其中分配在堆栈上,但只有union列表的第一个成员需要是完整类型。其他的可能是不完整的。回想起来,
std::optional
利用了这个属性。@cpluplusrat它是在C++17(或以前的)标准中声明的吗?这是否意味着我不能使用存储了不完整类型的std::无序_映射?如果有,还有其他选择吗?@walnut:一个普通类型如何(自动)拥有堆资源?谢谢你的更正。我仍然不明白我描述的哪些用法是有效的,如果有的话。在OP的示例中,在类型完成之前,没有一个容器成员被实例化。C++17中明确允许使用不完整类型实例化
std::vector
本身(但不是其成员)。我看不出你的解释是如何回答这个问题的。类型
list
forward\u list
vector
在C++17中被显式调用
std::vector
std::list
std::forward_list