2016-11-29 63 views
0

我創建了2個頭文件。 ListA.h和ListN.h重新定義錯誤:使用相同類名稱的不同.h文件

他們都自己使用自己的獨特的類列表。當我編譯我的程序(即使他們無法知道另一個存在,它說下面的錯誤)

enter image description here 我很確定它不應該是一個重新定義,但它顯然是。任何幫助表示讚賞。


ListA.h

#ifndef __LISTA_H_ 
#define __LISTA_H_ 
#include <iostream> 

using namespace std; 
class List{ 
     public: 
       List(int = 0); 
       List(const List&); 
       ~List(); 
}; 
#endif 

ListN.h

#ifndef __LISTN_H_ 
#define __LISTN_H_ 
#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = 10); 
       List(const List&); 
       ~List(); 
};  
#endif 

ListA.cpp

#include "ListA.h" 
using namespace std; 

List::List(int mySize) 
{ 
    //... 
} 

ListN.cpp

#include "ListN.h" 
#include <iostream> 
using namespace std; 
List::List(int size) 
{ 
    //... 
} 

主要

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

int main() 
{ 
    List myList; 
    return 0; 
} 
+1

它們都在同一個項目中,_might_與它有關。 –

+0

** [basic.def.odr] **「給定一個名爲D的實體定義在多個翻譯單元中,那麼D的每個定義都應包含相同的標記序列......」你違反了這個規則,一個名爲'List'的實體在不同的翻譯單元中定義不同。 –

回答

0

當連接器試圖鏈接找到列表定義/符號,它在兩個不同的OBJ文件發現因此連接器提供者錯誤。在Visual Studio中的錯誤編號:LNK2005

爲了解決這個錯誤,或者:

  1. 要修復,添加/FORCE:MULTIPLE到鏈接器命令行選項
  2. 添加類在兩個不同的命名空間,這將避免該錯誤。

ListN.h

#ifndef __LIST_H_ 
#define __LIST_H_ 
#include <iostream> 

using namespace std; 

namespace ListN 
{ 
    class List{ 
    public: 
     List(int = 10); 
     List(const List&); 
    }; 
} 

#endif 

ListN.cpp

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

using namespace std; 

namespace ListN 
{ 
    List::List(int size) 
    { 
     //... 
    } 
} 

Main.cpp的

#include <iostream> 
#include "ListN.h" 
int main() 
{ 
    ListN::List myList; 
    return 0; 
} 
+0

現在的主文件說List沒有在範圍 –

+0

中聲明使用用戶之前的命名空間像我的情況ListN :: List。或者使用名稱空間ListN添加。 – Swapnil

+0

@GunnerStone檢查更新的答案。 – Swapnil

0

這兩個cpp文件都由編譯器編譯。因此,當鏈接器將文件鏈接到一起時,它會變得混亂,因爲有多個類。

爲了解決這個問題,你可以使用命名空間,或者你冷不要暴露至少一個List類。


另外,如果當時的想法是能夠包括ListN.h VS ListA.h用於配置目的,這是錯誤的方式這樣做。您應該爲標頭設置#define參數,或者您應該找到其他方法,例如通過#ifdef。例如(我不是100%肯定這將編譯,但你的想法):

List.h

#ifndef __LIST_H_ 
#define __LIST_H_ 

#ifndef LIST_PARAM 
#define LIST_PARAM 0 
#endif 

#include <iostream> 

using namespace std; 

class List{ 
     public: 
       List(int = LIST_PARAM); 
       List(const List&); 
       ~List(); 
};  
#endif 

的main.cpp

#include <iostream> 

#define LIST_PARAM 10 
#include "List.h" 

using namespace std; 

int main() 
{ 
    List myList; 
    return 0; 
} 

我個人不喜歡這種方法;將值傳遞給構造函數會更好:

int main() 
{ 
    List myList{ 10 }; 
    return 0; 
} 
相關問題