繁体   English   中英

C++ 错误:隐式声明的定义

[英]C++ error: definition of implicitly-declared

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

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

linkedlist.cpp:5:24: 错误:隐式声明的 'constexpr LinkedList::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();
};

链表.cpp 文件:

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

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

请帮忙。

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

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

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

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

#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;
}

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

            #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();
            };

“我在 2018 年遇到了这个问题,尽管这是一个非常简单的问题,有一个非常简单的答案,但对我没有多大帮助。回想起来,我没有意识到 C++ 编译器是多么迂腐是。因为这个问题是新程序员引用的问题,所以我想这样回答,以尝试帮助我曾经(几年前)的一些人。”




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


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

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

让我们假设有一个错误显示一条消息,内容如下:

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

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

注意: sumClassNamesumFuncNamefoo显然会被您定义的类和函数的名称替换。



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


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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM