C++ 不创建类或链接文件,而是获取';未定义的引用';单空穴函数误差

C++ 不创建类或链接文件,而是获取';未定义的引用';单空穴函数误差,c++,C++,我在这里搜索并阅读了很多关于这个错误的帖子,但它们似乎都是关于将文件链接在一起或是搞乱创建类的。我两个都不做。这只是一个简单的程序,除了main之外还有一个函数。以下是我在编译器中遇到的错误,不是特定于任何代码行的: 架构x86_64的未定义符号: “删除重复(char*,int&)”,引用自: _电子测试中的主要问题 ld:未找到架构x86_64的符号 collect2:ld返回了1个退出状态 这是我的代码: #include <iostream> using namespace

我在这里搜索并阅读了很多关于这个错误的帖子,但它们似乎都是关于将文件链接在一起或是搞乱创建类的。我两个都不做。这只是一个简单的程序,除了main之外还有一个函数。以下是我在编译器中遇到的错误,不是特定于任何代码行的:

架构x86_64的未定义符号:
“删除重复(char*,int&)”,引用自:
_电子测试中的主要问题
ld:未找到架构x86_64的符号
collect2:ld返回了1个退出状态

这是我的代码:

#include <iostream>
using namespace std;
void delete_repeats(char arr[], int& length);
int main()
{
    char b;
    int length = 0;
    char arr[80] = {0};
    for (int i = 0; i < 80; i++)
    {
            cin.get(b);
            arr[i] = b;
            length += 1;
    }
    cout << endl << length << endl
    << arr << endl << arr << endl;
    delete_repeats(arr, length);
    cout << arr << endl << length;

    return 0;
}
void delete_repeats(char arr[], int length)
{
    for (int i = 0; i < length; i++)
    {
        for (int k = 1; k < length; k++)
        {
            if (arr[i] == arr[k])
            {
                for (int j = k; j < length; j++)
                {
                    arr[k] = arr[k+1];
                }
                arr[length -1] = 0;
                length -= 1;
            }
        }
    }
}
#包括
使用名称空间std;
void delete_重复(字符arr[],int和length);
int main()
{
字符b;
整数长度=0;
char arr[80]={0};
对于(int i=0;i<80;i++)
{
cin.get(b);
arr[i]=b;
长度+=1;
}
不能改变

void delete\u重复(字符arr[],整数长度)

void delete\u重复(字符arr[],int和length)

所发生的事情是,您正在声明一个函数,
void delete_repeats(char arr[],int&length);
(请注意,第二个参数是通过引用传递的,这就是
&
在本文中的含义)

然后,您试图将该函数定义为
void delete_repeats(char arr[],int length);
(注意第二个参数是如何通过值传递的),但实际上您是在用相同的名称声明和定义重载


您的链接器希望为第一个声明提供定义,但从未获得该定义。相反,它会看到一个新的声明(第二个)具有关联的定义并正确链接该定义。未定义的引用错误是您的链接器告诉您无法找到第一个声明的定义。

您的函数定义中缺少一个
int&

void delete_repeats(char arr[], int& length) {   }
//                                ^^^

函数定义中缺少引用符号

您已将函数定义为:

  void delete_repeats(char arr[], int& length);
但后来将其定义为:

  void delete_repeats(char arr[], int length)

参数长度在前者中声明为
int&
,但在后者中声明为普通的
int

D'oh!一定盯着它看了太久了,不会错过这样一个简单的差异。谢谢!@consuciussays没问题!如果这解决了您的问题,请确保将答案标记为已接受:)@AnthonyVallée-Dubois注意,答案不能在提问15分钟后,才能将其标记为已接受。