2013-02-10 87 views
0

我寫了我的程序,它的工作原理是當我把所有的東西放在頭文件中,然後有我的主文件。我現在將它們分解爲實現文件,但Eclipse不斷給我提供錯誤。它給了我錯誤的構造函數和函數的每個開頭大括號。它對所有人都說「重新定義(構造函數或方法的名稱),以前在這裏聲明。」我做錯了什麼,因爲它在頭文件中工作?實現與頭文件

#include "KeyValuePair.h" 

template<typename Key,typename Value> 
KeyValuePair<Key,Value>::KeyValuePair() 
{ // error here 
} 

template<typename Key,typename Value> 
void KeyValuePair<Key,Value>::setPair(Key key, Value value) 
{ // error here 
    pairKey = key; 
    pairValue = value; 
} 

template<typename Key,typename Value> 
Key KeyValuePair<Key,Value>::getKey() const 
{ // error here 
    return pairKey; 
} 

template<typename Key,typename Value> 
Value KeyValuePair<Key,Value>::getValue() const 
{ // error here 
    return pairValue; 
} 

頭文件:

#ifndef _KEYVALUEPAIR_H_ 
#define _KEYVALUEPAIR_H_ 

template<typename Key,typename Value> 
class KeyValuePair 
{ 
    private: 
     Key pairKey; 
     Value pairValue; 

    public: 
     KeyValuePair(); 
     void setPair(Key key,Value value); 
     Key getKey() const; 
     Value getValue() const; 
}; 



#include "KeyValuePair.cpp" 
#endif 
+0

模板定義進去的頭文件,你這樣做 – 2013-02-10 03:22:04

回答

1

你需要把對模板的所有代碼放到頭文件,因爲它們是按需編譯。

請參閱templates文檔。

+0

所有的代碼爲模板* *是在頭文件不'#include'實現文件沒有一個很好的理由,通過'#include' 。 – Johnsyweb 2013-02-10 03:16:31

2

目前的情況是,你的KeyValuePair.h文件有一個#include KeyValuePair.cpp在底部。 KeyValuePair.cpp也包含頭文件。頭文件具有通常的「保護」(#ifndef _KEYVALUEPAIR_H_)以防止被包含倍數,但您的CPP文件不包含。因此,當您嘗試編譯CPP文件時,它將拉入H文件,該文件再次拉入CPP文件。因此,多重定義錯誤。

簡單爲你解決,但不一定是最正確的,是從KeyValueHeader.cpp文件的頂部取下#include "KeyValuePair.h"線。

我懷疑你想你的Makefile中實際編譯KeyValuePair.cpp,你不需要(也不應該)做的。你只需要有源文件需要你的模板類#include "KeyValuePair.h"

爲模板,標準的做法是保持政治宣言和執行在同一個頭文件 - 這隱含避免這類問題。在模板類聲明中內聯模板類方法的實現並且所有內容都包含在單個頭文件中並不罕見。將你學到的有關界面與實現分離的所有知識都廢棄了,但更容易處理。

+0

一個常見的解決方案是對模板實現文件給予不同的擴展,例如, '.cppt'而不是'.cpp'。這提醒你爲什麼它被包含在頭文件中,以及爲什麼makefile不能單獨編譯它。 – 2013-02-10 04:53:27