相关疑难解决方法(0)

为什么std :: vector在类定义中使用不完整的类型?

出现以下问题:

c ++标准似乎在说,这std::vector需要一个完整的类型才能起作用。(请参阅https://en.cppreference.com/w/cpp/container/vector)那么,为什么下面的代码仍然可以编译?

#include <vector>

struct parent;

struct child
{
    std::vector<parent> parents; //parent is incomplete here!
};

struct parent
{
    std::vector<child> children;
};
Run Code Online (Sandbox Code Playgroud)

这似乎违反直觉。如果std::vector需要完整的类型,则std::vector<parent>不应编译,因为在的类定义中仅知道其前向声明child

  • 这种行为在类定义方面有什么特别之处吗?
  • 我弄错std::vector了吗,不需要完整的类型?
  • 或者,这只是a幸吗?从技术上讲,这是不允许的,但是无论如何它适用于所有实现...

编辑

c ++ 11和c ++ 17之间似乎有所不同。我想了解c ++ 11版本。

c++ std stdvector language-lawyer c++11

7
推荐指数
1
解决办法
225
查看次数

C++20 对 reverse_iterator 的哪些更改破坏了这段代码?

以下代码可在 C++11、C++14 和 C++17 中编译,但不能在 C++20 中编译。标准的什么变化破坏了这段代码?

#include <vector>
#include <utility>

template<typename T>
struct bar
{
    typename T::reverse_iterator x;
};

struct foo
{
    bar<std::vector<std::pair<foo, foo>*>> x;
};

int main()
{
    foo f;
}
Run Code Online (Sandbox Code Playgroud)

错误很长,但可以总结为:

模板参数必须是一个完整的类

c++ language-lawyer reverse-iterator c++20

6
推荐指数
1
解决办法
146
查看次数

标签 统计

c++ ×2

language-lawyer ×2

c++11 ×1

c++20 ×1

reverse-iterator ×1

std ×1

stdvector ×1