2017-08-28 81 views
1

注意:我做了一個DFH_lib.CPP,其中包括fstream和iomanip。我將所有的模板函數都保存在DFH_lib.CPP中。現在,如果我在MAIN.CPP中編寫剩餘的非模板函數並僅包含DFH_lib.h,則它將成功運行。我不明白爲什麼......鏈接器錯誤:重複函數

我正在使用模板製作數據文件處理庫。我創建了兩個文件:

DFH_lib.CPP 
Lib_Test.CPP 

我做了一個項目,並在編譯時點擊了「Build All」。我遇到了以下鏈接錯誤:

file_init(char near*) defined in module DFH_LIB.CPP is duplicated in module LIB_TEST.CPP

AddColumn(const int near&) defined in module DFH_LIB.CPP is duplicated in module LIB_TEST.CPP

file_init(char*);AddColumn(T data, const int& width);AddColumn(const int& width);是,我只是在DFH_lib.CPP定義的功能。我只在Lib_Test.CPP中調用這些函數。

DFH_lib.CPP

template <class T> //Function belongs to Pretty Printing Libary 
void AddColumn(T data, const int& width) { 
    cout<<setw(width)<<data<<" | "; 
} 
void AddColumn(const int& width) { 
    cout<<setw(width)<<setfill('_')<<"|"; 
} 
void file_init(char* file) { //File initialization function 
    ofstream fout; 
    fout.open(file, ios::binary|ios::noreplace); //File Created, noreplace prevents data loss 
    fout.close(); 
} 

,其中 「文件」 被定義爲Lib_Test.CPP

cout<<endl; AddColumn(record_id,7); AddColumn(char_member, 20); AddColumn(int_member, 11); AddColumn(float_member, 13); 
file_init(file); //initializes the file 

:爲什麼我得到char file[]="lib_Test.dat";

可能有人請解釋一下這個鏈接錯誤?我不明白這意味着什麼,因此,如何解決它......

編輯: 我注意到,這可能會導致由於同時包括文件,當我轉身的Lib_Test做了錯誤.CPP導入「Hello World」程序並出現相同的錯誤。還有一件事我注意到:只有非模板函數導致鏈接錯誤!

DFH_lib.CPP

#ifndef _DFH_lib_cpp 
#define _DFH_lib_cpp 

#include<fstream.h> 
#include<conio.h> 
#include<stdio.h> 
#include<iomanip.h> 
#include<string.h> 
..... 
#endif 

Lib_Test.CPP

#include<iostream.h> 
#include<conio.h> 
#include"DFH_lib.CPP" //Including DFH Libary 
+0

您需要將'#definition'添加到**每個文件**,所以還要添加到'lib_Test.cpp',問題可能是模板的使用會創建一個已經存在的原型。如何定義'char_member'和'int_member'?如果它們是相同的,它可能是原因......包含層次結構看起來不錯,所以它是模板中的錯誤或者它的用法,我沒有看到沒有完整的源代碼...嘗試去做MCVE(最小可編譯的可驗證的例如...在你的情況下不編譯:)) – Spektre

+0

給我一些時間,本週我有3個考試 –

+0

在你用'@ spektre'發表評論之後通知我 – Spektre

回答

0

我看到了這個問題,原因如下:

  1. 編譯器錯誤

    TC++有時編譯模板通常加入空行(在正確的地方)的問題或交換的代碼,幫助一些行。但是通常只有當你的源代碼達到一定的尺寸時纔會開始,比如30-50 Kbyte不能確定它的年代值。我不相信這是你的問題。

  2. 真的是重複

    如果你是其中一些文件多次,然後它會導致像您這樣的錯誤。爲了彌補,你可以封裝的每個文件到這一點:

    #ifndef _DFH_lib_cpp 
    #define _DFH_lib_cpp 
    // here comes your file DFH_lib.cpp content 
    #endif 
    

    其中_DFH_lib_cpp令牌被編碼要封裝的文件名。這將丟棄任何重複的包含。這也解決了全局變量存在的問題,但要小心,如果沒有正確包含,整個項目可能會不一樣。

+0

我認爲它是集成的,所有,鏈接,編譯,等等。另外,DFH_lib.CPP是20KB,Lib_test.CPP是4KB。如果問題依然存在,我會針對您的第二項建議做一些工作並回復您。 –

+0

@AnkurSingh是啊你是對的只是確認它在** DOS-BOX **'建立所有'也是如此**#3 **已過時。我會首先嚐試**#2 **,它只是每個文件的3行代碼......呃幾十年來還沒有運行過bc.exe直到現在:) – Spektre

+0

我確實在DFH_lib.CPP中添加了這些預處理器命令但它沒有幫助。我忘記包含的一件事是,我還將DFH_lib.CPP文件直接包含在lib_Test.CPP中。我沒有使用頭文件,因爲這給了我+7錯誤。 –