2013-02-10 88 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