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
4

2 回答 2

2

就目前而言,您的 KeyValuePair.h 文件#include KeyValuePair.cpp的底部有一个。KeyValuePair.cpp 也#includes 头文件。头文件具有通常的“保护”(#ifndef _KEYVALUEPAIR_H_)以防止被多次包含,但您的 CPP 文件没有。因此,当您尝试编译 CPP 文件时,它会拉入 H 文件,这会再次拉入 CPP 文件。因此,多重定义错误。

对您来说最简单但不一定最正确的解决方案是#include "KeyValuePair.h"从 KeyValueHeader.cpp 文件的顶部删除该行。

我怀疑您正在尝试在 Makefile 中实际编译 KeyValuePair.cpp,而您不需要(也不应该)这样做。您只需要拥有需要模板类的源文件即可#include "KeyValuePair.h"

模板的标准做法是将声明和实现保留在同一个头文件中——这隐含地避免了这类问题。在模板类声明中内联模板类方法的实现并且全部包含在单个头文件中的情况并不少见。破坏了你学到的关于接口与实现分离的一切,但更容易使用。

于 2013-02-10T03:11:29.700 回答
1

您需要将模板的所有代码放入头文件中,因为它们是按需编译的。

请参阅模板文档。

于 2013-02-10T03:08:24.443 回答