1. 程式人生 > >呼叫模板類出現 undefined reference 錯誤的解決方法

呼叫模板類出現 undefined reference 錯誤的解決方法

除錯了一上午,搞了半天是這個g++編譯器本身的問題,模板類果然是個麻煩的傢伙。
  g++不支援模板類的分離編譯,因此模板的實現最好都些在.h檔案中,否則將出現undefined reference to XXXX 的錯誤。下面是一個出錯的例子,解決方法就是將unilinklist.c中的程式碼移到unilinklist.h中。
//unilinklist.h

#ifndef UNILINKLIST_H_INCLUDED
#define UNILINKLIST_H_INCLUDED template <typename T>
class Unilinklist
{
    public:
    typedef struct Node
        {
        Node *next ;
        T data;
        }Node;
     Unilinklist();
     Unilinklist(Unilinklist<T>& o_link);
     Unilinklist(T data, int length);
     ~Unilinklist();      int getlength();
     void* gethead();
     bool travelover();
     void copyself(Node** tothird);
     bool isempty();
     void add_back(T data);
     void del_back();
     bool insert(int pos, T data);     private:      Node* head ;
     Node* prevent;
     Node* end;
     int count ; }; template <typename T>
Unilinklist<T>::Unilinklist()
{
    prevent = end = head = new Node;
    count = 0;
}
template <typename T>
Unilinklist<T>::Unilinklist(T data, int length)
{
    count = 0;
    prevent = end = head = new Node;
    while(length-- > 0)
    {
        prevent = new Node;
        prevent->data = data;
        end->next = prevent;
        end = prevent;
        end->next = NULL;
        count++;
    }
}
template <typename T>
Unilinklist<T>::Unilinklist(Unilinklist<T>& o_link)
{
    count = 0;
    prevent = end = head = new Node;
    o_link.copyself(&head);
    end = prevent = head->next;
    while(prevent->next != NULL)
    {
        prevent = prevent->next;
        end = prevent;
        count++;
        //cout<< count << endl;
    }
    end->next = NULL;
}
template <typename T>
Unilinklist<T>::~Unilinklist()
{
    while (head->next != NULL)
    {
        del_back();
        //cout <<count<<endl;
    }
} template <typename T>
int Unilinklist<T>::getlength()
{
    return count;
}
template <typename T>
bool Unilinklist<T>::travelover()
{
    std::cout << "********The data is:*******" << std::endl;
    prevent = head->next;
    while (prevent == NULL)
        return false;     do
    {
        std::cout<<prevent->data<<std::endl;
        prevent = prevent->next;
    }
    while(prevent != NULL);
    std::cout << "*******The end************\n"<<std::endl;
    return true;
}
template <typename T>
void* Unilinklist<T>::gethead()
{
    return head;
}
template <typename T>
void Unilinklist<T>::copyself(Node** tothird)
{
    std::cout<<"Copy constructor is running"<<std::endl;
    Node* temp;
    Node* tempre;
    Node* tempend;
    temp = new Node;
    tempend = tempre= temp;
    prevent = head->next;
    while(prevent != NULL)
    {
        tempre = new Node;
        tempre->data = prevent->data;
        prevent = prevent->next;
        tempend->next = tempre;
        tempend = tempre;
        tempend->next = NULL;
    }     *tothird = temp;
    std::cout<<"Copy success"<<std::endl;
}
template <typename T>
bool Unilinklist<T>::isempty()
{
    return (head->next == NULL);
}
template <typename T>
void Unilinklist<T>::add_back(T data)
{
    prevent = new Node;
    prevent->data = data;
    end->next = prevent;
    end = prevent;
    end->next = NULL;
    count++;
}
template <typename T>
void Unilinklist<T>::del_back()
{
    prevent = head;
    while (prevent->next->next != NULL)
    {
        prevent = prevent->next;
    }
    if(prevent->next != NULL)
    {
        end = prevent;
        delete(prevent->next);
        end->next = NULL;
        count--;
    }
    // cout<<count<<endl; }
template <typename T>
bool Unilinklist<T>::insert(int pos, T data)
{
    if(pos > count)
    {
        std::cout<<"The position is wrong" <<std::endl;
        return false;
    }
    prevent = head;
    while(--pos != 0)
    {
        prevent = prevent->next;
    }
    Node* temp = new Node;
    temp->data = data;
    temp->next = prevent->next;
    prevent->next = temp;
    return true;
} #endif // UNILINKLIST_H_INCLUDED
 

//test.c

#include <iostream>
#include "unilinklist.h"

int main()
{
    std::cout << "Default Constructor:\n" << std::endl;
    Unilinklist<int> lk1(325, 6);
    lk1.add_back(1);
    lk1.add_back(2);
    lk1.add_back(8);
    lk1.add_back(9);
    lk1.add_back(88);
    lk1.insert(3, 3233539);
    lk1.travelover();
    lk1.del_back();
    lk1.travelover();
    Unilinklist<int>lk2 = lk1;
    lk2.travelover();
    lk2.del_back();
    lk2.travelover();

    return 0;
}

相關推薦

呼叫模板出現 undefined reference 錯誤解決方法

除錯了一上午,搞了半天是這個g++編譯器本身的問題,模板類果然是個麻煩的傢伙。   g++不支援模板類的分離編譯,因此模板的實現最好都些在.h檔案中,否則將出現undefined reference to XXXX 的錯誤。下面是一個出錯的例子,解決方法就是將unilink

使用Dev C++編譯C++工程時出現undefined reference 錯誤

我的工程包含三個檔案,Vector模板類的宣告檔案Vector.h和定義檔案Vector.cpp以及主函式main.cpp,具體程式碼如下: // Vector.h #ifndef VECTOR_H #define VECTOR_H #include <iostream>

安裝Matlab出現Error 1935錯誤解決方法

技術 啟動 運行 十進制 gist log ror oca 下拉菜單 1、開始 - 運行(輸入regedit.exe)- 確定或者回車,打開註冊表編輯器; 2、在打開的註冊表編輯器中找到:HKEY_LOCAL_MACHINE ,並展開:HKEY_LOCAL_MACHINE

SpringMVC提交數據遭遇基礎型和日期型報400錯誤解決方法

筆記 運行 inpu 遭遇 imp public 增加 試用 too 使用SpringMVC開發的時候,頁面如果有日期格式的數據,後臺接受也是java.util.Date,則報告400錯誤 。下面是解決方案的演示示例: 這個是實體類,裏面createDate就是ja

navicat連線資料庫的時候出現1045的錯誤解決方法

使用navicat連線資料庫的時候出現了1045的錯,那肯定是你的賬號密碼填錯了,新版的mysql的一般不會出現這個錯誤,當你確定你的密碼沒有填錯的時候,你可以重啟伺服器嘗試一下,當你操作伺服器的時候,有可能在你操作完畢以後出現殭屍程序的出現,這時候就需要你重啟伺服器了,要是重啟伺服器依然不成功,那

sql 更新date欄位報“格式程式碼出現兩次”錯誤解決方法.

原來報錯的語句:update COMPANY_RECORD t set t.valid_date = to_date('2014/11/13 12:00:00','yyyy/MM/dd HH:mm:ss ');        正確的語句:update COMPANY_REC

“Internet連線共享訪問被啟用時,出現了一個錯誤解決方法

本人電腦Win7,前段時間還能共享本地連線給無線上網,現在共享的時候卻莫名的出現了錯誤:“Internet連線共享訪問被啟用時,出現了一個錯誤”。 通過查詢得到共享需要開啟服務"Internet Connection sharing",在執行中輸入services.ms

PHP 編譯安裝時出現 undefined reference to `libiconv' 錯誤解決方法

原文:http://flyfishes.blog.51cto.com/3527694/819693 手動編譯PHP安裝時遇到如下錯誤 /usr/local/src/php-5.3.10/ext/xmlrpc/libxmlrpc/encodings.c:73: und

(用iis呼叫com來操縱Excel) 檢索 COM 工廠中 CLSID 為{00024500-0000-0000-C000-000000000046} 的元件時失敗,原因是出現以下錯誤: 80070005。8000401A的錯誤解決方法

.NET匯出Excel遇到的80070005錯誤的解決方法: 檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046}的元件時失敗,原因是出現以下錯誤: 80070005基本上.net匯出excel檔案,都需要如此配置一下,不配置有的時候沒錯,而

關於Cmake 連結靜態庫出現undefined reference to錯誤

在編寫一個C++專案的時候,使用cmake管理工程,成功連結一個靜態庫,但是在編譯時仍然出現undefined reference to 的錯誤。 最終發現問題是由於c和c++混編導致的。 解決方案: 由於我連結的庫是使用c語言編寫,所以需要在include標頭檔案時加上 #

Linux Ubuntu執行執行緒程式出現undefined reference to ‘pthread_create’和undefined reference to ‘pthread_join’錯誤

Linux Ubuntu執行執行緒程式出現undefined reference to ‘pthread_create’和undefined reference to ‘pthread_join’錯誤。 編寫好執行緒程式碼,進行編譯 gcc xiancheng.c -o xiancheng 出

linux 連結庫檔案出現undefined reference to" 問題的解決方法

最近在Linux下程式設計發現一個詭異的現象,就是在連結一個靜態庫的時候總是報錯,類似下面這樣的錯誤: (.text+0x13): undefined reference to `func'      關於undefined reference這樣的問題,大家其實經常會遇

解決使用NDK進行編譯時出現undefined reference to function的問題

之前在編譯jni時出現了undefined reference to function這個問題,查閱相關資料說是可能連結的庫問題,然後通過各種gcc調整順序解決了這個問題。這個工程是導師的工程,工程在Linux環境下執行無誤,我從Linux環境往Android

c/c++中出現undefined reference to”的解決

undefined reference to”的意思是,該函式未定義。 如果使用的是gcc,有以下檢查方案: 如果提示未定義的函式是某個庫的函式。檢查庫時候已經安裝,並在編譯命令中採用-l和-L引數匯入庫。 如果提示未定義的函式是程式中的函式。檢查是否在標頭檔案中宣告

Latex:IEEE會議模板出現undefined control sequence \includegraphics問題解決方法

  最近要參加一個IEEE主辦的國際會議,使用中官網提供的Latex模板寫論文,當插入EPS格式的圖片時,提示錯誤:undefined control sequence \includegraphics。 說明Latex無法識別\includegraphics, 在前面的程

在linux下靜態連結庫存在,但是在連結過程會出現undefined reference錯誤

如題,使用linux編譯程式時,需要靜態連結庫。 在連結過程也已指定靜態庫的路徑及庫名,且連結器能找到指定的庫,但會提示庫中被呼叫的函式undefined reference 這是需要檢查連結庫在連結命令中的位置,要保證依賴該庫的中間檔案或庫在它的前面。 即若一個程式需要l

ubuntu 使用sudo apt-get update 出現 被配置多次導致無法升級錯誤解決方法

code 開發機 goup 使用 lin logs 配置 周末 ubun 這個周六周末在考慮升級自己GPU開發機,在琢磨使用docker來按轉tensorflow環境,在升級軟件的時候爆出了如下錯誤 在 /etc/apt/sources.list.d/sogoupin

yum 下載時出現錯誤解決方法

yum1,ping www.baidu.com 驗證你是否能夠上網2,ping 223.5.5.5 ping域名不通,ping外網地址時通了,你的DNS配置有問題。3,修改DNS網卡的配置文件 如: cp /etc/sysconfig/network-scripts/ifcfg-eth0 /t

VS2017試用期到期後登錄微軟賬戶出現錯誤解決方法

試用 mini could not identity install trac sig nbsp connected 關於使用VS2017試用期一個月到後,需要登錄微軟賬戶後進行認證後才能重新使用,但是登錄成功後出現如下錯誤 We could not refresh the

HTML使用post方式提交中文內容出現亂碼的錯誤解決方式

form 輸出 itl title com println orm doctype ctype 今天在做一個例子的時候,使用post方式提交表單,如果有中文的話,在另一個頁面顯示出來的時候,總是會出現亂碼; 但是將提交方式改為get的時候,就不會出現這種錯誤。 詳細錯誤