【问题标题】:C++ error: definition of implicitly-declaredC++ 错误:隐式声明的定义
【发布时间】:2017-11-03 09:40:34
【问题描述】:

我正在用 C++ 编写这个链表程序

当我测试程序时,我得到了错误

linkedlist.cpp:5:24:错误:隐式声明的“constexpr LinkedList::LinkedList()”的定义 链表::链表(){

这是代码

linkedlist.h 文件:

#include "node.h"
using namespace std;

class LinkedList {
  Node * head = nullptr;
  int length = 0;
public:
  void add( int );
  bool remove( int );
  int find( int );
  int count( int );
  int at( int );
  int len();
};

linkedlist.cpp 文件:

#include "linkedlist.h"
#include <iostream>
using namespace std;

LinkedList::LinkedList(){
  length = 0;
  head = NULL;
}
/*and all the methods below*/

请帮忙。

【问题讨论】:

  • 如果您所做的只是成员的初始化,则不需要构造函数 - 您已经在标题中完成了。

标签: c++ compiler-errors


【解决方案1】:

在头文件中声明无参构造函数:

class LinkedList {
{
....
public:
    LinkedList();
    ....
}

您在 .cpp 文件中定义它而没有实际声明它。但是由于编译器默认提供了这样一个构造函数(如果没有声明其他构造函数),错误清楚地表明您正在尝试定义一个隐式声明的构造函数。

【讨论】:

  • 但是指令说我不应该修改头文件。
  • 如果你想定义一些东西,你也需要声明它。
【解决方案2】:

您应该在类内声明构造函数,以便在类外定义 cunstructor。否则你应该在类本身中定义它。你的类应该是这样的。

            #include "node.h"
            using namespace std;
            class LinkedList {
              Node * head = nullptr;
              int length = 0;
            public:
              LinkedList();
              void add( int );
              bool remove( int );
              int find( int );
              int count( int );
              int at( int );
              int len();
            };

【讨论】:

    【解决方案3】:

    要在类外定义构造函数,你需要先在公共说明符中声明它,然后在类外定义它。

    #include "node.h"
    using namespace std;
    
    class LinkedList {
      Node * head = nullptr;
      int length = 0;
    public:
      LinkedList();
      void add( int );
      bool remove( int );
      int find( int );
      int count( int );
      int at( int );
      int len();
    };
    
    
    LinkedList::LinkedList(){
      length = 0;
      head = NULL;
    }
    

    【讨论】:

      【解决方案4】:

            “我在 2018 年遇到过这个问题,尽管这是一个非常简单的问题,但答案也非常简单,但对我没有多大帮助。回想起来,我没有不知道 C++ 编译器有多么迂腐。因为这个问题是新程序员引用的一个问题,所以我想这样回答它,以帮助我小时候(几年前)的一些人。




      ERROR: implicitly-declared ... 是什么意思?


            此错误具体意味着,您尝试编译的函数未在您的类中明确定义。如果需要,请查找 ImplicitExplicit 的英文定义。

            对于没有太多编写代码经验的人来说,这可能是一个非常令人沮丧的“编译器错误”,这主要是因为它可能会新学习者将遇到的第一个错误类型之一,并且必须学会排除故障。对implicitly declared 错误进行故障排除并不难,而且过程始终相同。解决implicitly defined 错误时要采取的第一步是检查您的课程。在检查您的课程时,您希望检查错误所抱怨的实体的定义,例如:

      假设有一个错误,显示如下消息:

      ERROR: Implicitly declared "const sumClassName sumClassName::sumFuncName(const int &amp;foo)" is not allowed!

      这意味着你需要立即,在你做任何其他事情之前,检查你是否确实在你的类中添加了“const className::sumFuncName(const int foo)”的声明

      注意:sumClassNamesumFuncName、&foo 显然会替换为您定义的类和函数的名称。



      尽管已在您的类中正确声明了函数,但您是否收到错误?


      在这种情况下,您需要非常迂腐——如果需要,请查阅 pedantic,这是调试时要知道的重要词。

      下面的摘录对于老手来说可能有点读不懂,但希望它能让一些人了解 C++ 编译器的定义代码。 99/100 次,当您收到一条错误消息时,告诉您 “隐式声明了某些内容”,这是因为您的语法错误。如果错误不是完全没有声明,则很可能是声明的函数签名或定义的函数签名中缺少某些语法。

      了解 C++ 编译器的迂腐程度,或者更确切地说,了解 C++ 语言的迂腐程度非常重要。你自己需要有迂腐的本性。当我开始编程时,我经常把事情搞混,当我陷入一个隐式定义的错误时,我引用了这个问题。这是我当时不明白的。在编写函数(和/或方法)时,您必须定义如何传递数据,数据是可变的还是不可变的,从哪里返回值。您还必须定义它是否可以访问类成员,或者它是否是类成员(朋友函数/成员函数),您必须定义它是否可以公开访问,提供有限访问,或者它是否完全不可访问非会员。然后你必须定义所有更明显的部分,比如函数的返回类型、参数、参数类型、参数的可变性、参数的值传递或引用传递。只有在所有这些之后,您才能继续在类之外为您的函数编写定义。当你去定义类之外的函数时,如果我刚才提到的事情之一是关闭的,你会让编译器认为你定义了一个与你声明的函数不同的函数,这就是它抛出一个隐式定义的原因错误,因为它没有与之匹配的声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2013-03-20
        • 2018-06-11
        相关资源
        最近更新 更多