<i id='4aE2Z'><tr id='4aE2Z'><dt id='4aE2Z'><q id='4aE2Z'><span id='4aE2Z'><b id='4aE2Z'><form id='4aE2Z'><ins id='4aE2Z'></ins><ul id='4aE2Z'></ul><sub id='4aE2Z'></sub></form><legend id='4aE2Z'></legend><bdo id='4aE2Z'><pre id='4aE2Z'><center id='4aE2Z'></center></pre></bdo></b><th id='4aE2Z'></th></span></q></dt></tr></i><div id='4aE2Z'><tfoot id='4aE2Z'></tfoot><dl id='4aE2Z'><fieldset id='4aE2Z'></fieldset></dl></div>

    <legend id='4aE2Z'><style id='4aE2Z'><dir id='4aE2Z'><q id='4aE2Z'></q></dir></style></legend>
    • <bdo id='4aE2Z'></bdo><ul id='4aE2Z'></ul>
    <tfoot id='4aE2Z'></tfoot>
  1. <small id='4aE2Z'></small><noframes id='4aE2Z'>

      为什么不能将前向声明用于 std::vector?

      Why can#39;t a forward declaration be used for a std::vector?(为什么不能将前向声明用于 std::vector?)
        <tbody id='SdLGB'></tbody>

      1. <tfoot id='SdLGB'></tfoot>
        • <bdo id='SdLGB'></bdo><ul id='SdLGB'></ul>
          <legend id='SdLGB'><style id='SdLGB'><dir id='SdLGB'><q id='SdLGB'></q></dir></style></legend>
        • <small id='SdLGB'></small><noframes id='SdLGB'>

              <i id='SdLGB'><tr id='SdLGB'><dt id='SdLGB'><q id='SdLGB'><span id='SdLGB'><b id='SdLGB'><form id='SdLGB'><ins id='SdLGB'></ins><ul id='SdLGB'></ul><sub id='SdLGB'></sub></form><legend id='SdLGB'></legend><bdo id='SdLGB'><pre id='SdLGB'><center id='SdLGB'></center></pre></bdo></b><th id='SdLGB'></th></span></q></dt></tr></i><div id='SdLGB'><tfoot id='SdLGB'></tfoot><dl id='SdLGB'><fieldset id='SdLGB'></fieldset></dl></div>

                本文介绍了为什么不能将前向声明用于 std::vector?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                如果我像这样创建一个类:

                If I create a class like so:

                // B.h
                #ifndef _B_H_
                #define _B_H_
                
                class B
                {
                private:
                    int x;
                    int y;
                };
                
                #endif // _B_H_
                

                并像这样使用它:

                // main.cpp
                #include <iostream>
                #include <vector>
                
                class B; // Forward declaration.
                
                class A
                {
                public:
                    A() {
                        std::cout << v.size() << std::endl;
                    }
                
                private:
                    std::vector<B> v;
                };
                
                int main()
                {
                    A a;
                }
                

                编译main.cpp 时编译器失败.现在我知道的解决方案是 #include "B.h",但我很好奇它为什么会失败.g++cl 的错误信息在这件事上都没有什么启发.

                The compiler fails when compiling main.cpp. Now the solution I know is to #include "B.h", but I'm curious as to why it fails. Neither g++ or cl's error messages were very enlightening in this matter.

                推荐答案

                编译器需要知道B"有多大,才能生成合适的布局信息.相反,如果您说的是 std::vector,那么编译器就不需要知道 B 有多大,因为它知道一个指针有多大.

                The compiler needs to know how big "B" is before it can generate the appropriate layout information. If instead, you said std::vector<B*>, then the compiler wouldn't need to know how big B is because it knows how big a pointer is.

                这篇关于为什么不能将前向声明用于 std::vector?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                What is the past-the-end iterator in STL C++?(STL C++ 中的最后迭代器是什么?)
                vector::at vs. vector::operator[](vector::at 与 vector::operator[])
                C++ equivalent of StringBuffer/StringBuilder?(C++ 等效于 StringBuffer/StringBuilder?)
                Adding types to the std namespace(将类型添加到 std 命名空间)
                Is the C++ std::set thread-safe?(C++ std::set 线程安全吗?)
                How to use std::find/std::find_if with a vector of custom class objects?(如何将 std::find/std::find_if 与自定义类对象的向量一起使用?)
                <i id='0fQ28'><tr id='0fQ28'><dt id='0fQ28'><q id='0fQ28'><span id='0fQ28'><b id='0fQ28'><form id='0fQ28'><ins id='0fQ28'></ins><ul id='0fQ28'></ul><sub id='0fQ28'></sub></form><legend id='0fQ28'></legend><bdo id='0fQ28'><pre id='0fQ28'><center id='0fQ28'></center></pre></bdo></b><th id='0fQ28'></th></span></q></dt></tr></i><div id='0fQ28'><tfoot id='0fQ28'></tfoot><dl id='0fQ28'><fieldset id='0fQ28'></fieldset></dl></div>

                  <legend id='0fQ28'><style id='0fQ28'><dir id='0fQ28'><q id='0fQ28'></q></dir></style></legend>
                    1. <tfoot id='0fQ28'></tfoot>

                      <small id='0fQ28'></small><noframes id='0fQ28'>

                          <tbody id='0fQ28'></tbody>

                        • <bdo id='0fQ28'></bdo><ul id='0fQ28'></ul>