【问题标题】:When does an Incomplete Type error occur in C++C++中什么时候出现不完整类型错误
【发布时间】:2017-12-11 07:18:53
【问题描述】:

谁能告诉我 c++ 编译器何时会抛出“不完整类型错误”?

注意:我故意让这个问题有点开放式,以便我可以自己调试我的代码。

【问题讨论】:

  • 未定义或无效的可能有 cv 限定的类型是不完整的类型。对象不应被定义为不完整类型。不,这不是一个好的问题格式
  • @PasserBy 我有人回答了我的问题并帮助我找出了错误。他比你更有帮助。不过,谢谢。

标签: c++ incomplete-type


【解决方案1】:

这通常发生在编译器看到前向声明但没有该类型的完整定义时,而该类型正在某处使用。例如:

class A;

class B { A a; };

第二行会导致编译器错误,并且根据编译器的不同,会报告一个不完整的类型(其他编译器会给你不同的错误,但意思是一样的)。

但是,当您只使用指向此类前向声明​​的指针时,不会出现任何抱怨,因为指向类的指针的大小始终是已知的。像这样:

class A;
class B {
   A *a;
   std::shared_ptr<A> aPtr;
};

如果您在出现此错误时询问具体应用程序或库中可能出现的问题:这通常发生在包含包含前向声明但尚未找到完整定义的标头时。解决方案非常明显:还包括可以让您访问完整类型的标题。有时您也可能只是没有用于某个类型的命名空间或使用了错误的命名空间,而需要改正它。

【讨论】:

  • 实际上在我的情况下,它来自 PCL 库头文件 。由于它是一个库文件,因此文件中不应该有任何错误。应该还有其他原因导致此错误。
  • 项目中包含了头文件但没有链接库的情况下是否会出现这种情况???
  • 不,编译和链接是两个不同的步骤。首先编译器必须创建目标代码(因此需要知道所有使用的类型),然后链接器将它们全部链接到最终的二进制文件中。
  • 谢谢。编辑非常有用。在包含标题之前,我包含了包含完整定义的文件。那行得通。
【解决方案2】:

当您在具有默认析构函数的类中使用带有std::unique_ptr 的前向声明(例如,实现 PIMPL 习惯用法)时也会发生这种情况,这会导致此类问题。

这里解释得很好:Forward declaration with unique_ptr?

【讨论】:

    【解决方案3】:

    就我而言,这是由于对模板的了解不足。我在模板定义和与该模板关联的函数之间声明了一个类。

    template<typename T>
    class
    {
      foo a;
      foo b;
    };
    function(T a,int b)
    {
    
     . . . . .
    
    }
    

    这会产生问题,因为模板定义与类相关联,在这种情况下,T is not definedincomplete type is not allowed 的函数的参数列表中出现错误。如果您必须为多个实体使用模板,那么您必须在该实体的定义之前重用此语句:

    template<typename T>
    

    【讨论】:

      【解决方案4】:

      当我们尝试使用一个类/对象或其方法并且它们还没有被定义时,就会发生这种情况。例如

      class A;
      class B {
          class A obj;
      }
      

      class A;
      class B {
          class A *obj;
          B() {   
                 obj->some_method();
              }
      

      要解决这个问题,必须首先定义 A 或者必须给出它的全部声明(最佳做法是在头文件中进行),并且应稍后定义两个类的所有方法(最佳做法是这样做在另一个文件中)。

      class A {
          //definition
      }
      class B {
      class A obj;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-22
        • 2015-10-27
        • 2012-05-17
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-10
        相关资源
        最近更新 更多