出现以下问题:
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了吗,不需要完整的类型?编辑
c ++ 11和c ++ 17之间似乎有所不同。我想了解c ++ 11版本。
以下代码可在 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)
错误很长,但可以总结为:
模板参数必须是一个完整的类