Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++ 如何在值类型为类it';她在吗?_C++ - Fatal编程技术网

C++ 如何在值类型为类it';她在吗?

C++ 如何在值类型为类it';她在吗?,c++,C++,此代码: class Foo { std::unordered_map<std::string, Foo> x; }; class-Foo{ std::无序地图x; }; 给我一个错误: /usr/include/c++/4.7/bits/stl_pair.h:94:11: error: 'std::pair<_T1, _T2>::second' has incomplete type foo.cpp:4:7: error: forward declara

此代码:

class Foo {
    std::unordered_map<std::string, Foo> x;
};
class-Foo{
std::无序地图x;
};
给我一个错误:

/usr/include/c++/4.7/bits/stl_pair.h:94:11:
  error: 'std::pair<_T1, _T2>::second' has incomplete type
foo.cpp:4:7: error: forward declaration of 'class Foo'
/usr/include/c++/4.7/bits/stl\u pair.h:94:11:
错误:“std::pair::second”的类型不完整
foo.cpp:4:7:错误:“类foo”的转发声明
但是,这段代码编译得很好:

class Foo {
    std::vector<Foo> x;
};
class-Foo{
std::向量x;
};

这是库/编译器错误吗?

< p> C++标准指定了各种模板,使模板参数成为不完整类型。

2017年及更高版本的标准允许在仅为容器模板
std::forward_list
std::list
std::vector
实例化类模板时,容器的
value_type
为不完整类型,并且仅当分配器类型满足“”时。默认分配器模板
std::allocator
始终满足分配器完整性要求。实例化容器类模板的任何成员仍然需要完成
value\u type

对于任何其他标准容器类型,不提供此信息。在未指定的情况下,允许实现接受一个容器类模板而不是另一个容器类模板的不完整类型,并且仍然保持一致

为了使代码可移植,请避免在完成类型之前制作任何类型的容器,除非标准特别允许

形式上,一般约束可在适用于代码的以下规则()中找到:

在某些情况下(替换函数、处理函数、用于实例化标准库模板组件的类型的操作),C++标准库依赖于C++程序提供的组件。如果这些组件不满足其要求,则标准不会对实现提出任何要求

特别是,在以下情况下,影响未定义:

  • 如果在实例化模板组件时将不完整的类型用作模板参数,除非该组件特别允许

这三条语句专门允许
forward\u list
list
vector
使用不完整的模板参数,它们可以在章节和中找到。

@Xeo:这显然不是一个bug,因为(我引述)“标准没有对实现提出任何要求”。如果一个bug没有遵守要求,如果没有要求,那么它就不可能是bug。您可以始终使用Boost.Container。它们显式地允许使用不完整的类型进行安装。请参阅,因此“效果未定义”并不意味着“未定义的行为”?@sbi:它意味着“未定义的行为”,当且仅当实现允许它编译并且没有提供更强有力的保证时。但通常会出现转换失败,而不是未定义的运行时行为。