2015-07-19 32 views
1

我已經在這裏搜索和閱讀了很多關於這個錯誤的帖子,但他們似乎都是關於鏈接文件在一起或者搞亂創建類。我既不幹。這只是一個簡單的程序,除了main之外還有一個函數。下面是我得到在我的編譯器錯誤,不針對任何一行代碼:用於建築x86_64的不創建類或鏈接文件,但獲得單一無效功能的'未定義引用'錯誤

未定義的符號:
「delete_repeats(字符*,詮釋&)」,從引用:在Etest法
_main .O
LD:符號(S)沒有發現建築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; 
      } 
     } 
    } 
} 

上面的錯誤是當我嘗試提交它在myprogramminglab.com
當我嘗試在代碼塊中建立它,它給了我同樣的錯誤,但較少的細節,只是「​​未定義的引用'delete_repeats(char *,int &)'

我在這一點上做了很多程序,使用類似的功能,但這是我第一次遇到這個錯誤。我無法弄清楚我做錯了什麼。你能幫我解決嗎?

回答

2

變化

void delete_repeats(char arr[], int length)

void delete_repeats(char arr[], int& length)

發生了什麼事是,你聲明一個函數,void delete_repeats(char arr[], int& length);(注意,第二個參數是按引用傳遞,這就是&在這方面意味着)。

然後,您試圖將該函數定義爲void delete_repeats(char arr[], int length);(請注意第二個參數是如何通過值傳遞的),但實際上是聲明和定義具有相同名稱的重載。

您的鏈接器期望爲第一個聲明提供一個定義,但永遠不會獲取它。相反,它會看到一個帶有關聯定義的新聲明(第二個聲明),並將其正確鏈接。未定義的引用錯誤是你的鏈接器告訴你它找不到第一個聲明的定義。

+0

D'oh!爲了不想錯過這麼簡單的差異,必須一直盯着它太久了。謝謝! – madEngineer

+1

@ConfuciusSays沒問題!如果解決了您的問題,請務必將答案標記爲已接受:) –

+0

@AnthonyVallée-Dubois請注意,只有在詢問問題15分鐘後,才能將答案標記爲已接受。 – yizzlez

0

你缺少你的函數定義的int&

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

你已經錯過了在函數定義的參考符號。

你定義的函數爲:

void delete_repeats(char arr[], int& length); 

但後來將它定義爲:

void delete_repeats(char arr[], int length) 

參數長度被聲明爲前int&但後者平原int

相關問題