繁体   English   中英

实施与头文件

[英]Implementation vs. Header File

我已经编写了程序,当我将所有内容都保留在头文件中并拥有主文件时,它就可以工作。 我现在将它们分成实现文件,但是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

现在,您的KeyValuePair.h文件在底部具有#include KeyValuePair.cpp KeyValuePair.cpp还#include头文件。 头文件具有通常的“保护”(#ifndef _KEYVALUEPAIR_H_),以防止被多次包含,但您的CPP文件则没有。 因此,当您尝试编译CPP文件时,它会拉入H文件,该文件又会拉入CPP文件。 因此,多重定义错误。

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

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

模板的标准做法是将声明和实现保留在同一头文件中-隐式避免了此类问题。 内联到模板类声明中并内含在单个头文件中的模板类方法的实现并不少见。 破坏了您所学到的关于将接口与实现分离的所有知识,但是更易于使用。

您需要将模板的所有代码放入按需编译的头文件中。

请参阅模板文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM