Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实现与头文件_C++ - Fatal编程技术网

C++ 实现与头文件

C++ 实现与头文件,c++,C++,我已经写了我的程序,当我把所有的东西都保存在头文件中,然后有我的主文件时,它就工作了。我现在将它们拆分为实现文件,但Eclipse不断给我错误。它在构造函数和函数的每个左括号处都给我错误。它在所有这些文件上都写着“重新定义(构造函数或方法的名称),之前在这里声明过。”我做错了什么,因为它在头文件中工作 #include "KeyValuePair.h" template<typename Key,typename Value> KeyValuePair<Key,Value&g

我已经写了我的程序,当我把所有的东西都保存在头文件中,然后有我的主文件时,它就工作了。我现在将它们拆分为实现文件,但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;
}
#包括“KeyValuePair.h”
模板
KeyValuePair::KeyValuePair()
{//这里有错误
}
模板
void KeyValuePair::setPair(键、值)
{//这里有错误
派尔基=钥匙;
pairValue=值;
}
模板
Key KeyValuePair::getKey()常量
{//这里有错误
返回派尔基;
}
模板
值KeyValuePair::getValue()常量
{//这里有错误
返回对值;
}
头文件:

#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
\ifndef\u键值对_
#定义_KEYVALUEPAIR_H_
模板
类KeyValuePair
{
私人:
钥匙佩尔基;
值对值;
公众:
KeyValuePair();
无效集合对(键、值);
Key getKey()常量;
值getValue()常量;
};
#包括“KeyValuePair.cpp”
#恩迪夫

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


请参阅文档。

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


请参阅文档。

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

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

我怀疑您正在尝试在Makefile中编译KeyValuePair.cpp,而您不需要(也不应该)这样做。您只需要有需要模板类包含“KeyValuePair.h”的源文件


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

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

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

我怀疑您正在尝试在Makefile中编译KeyValuePair.cpp,而您不需要(也不应该)这样做。您只需要有需要模板类包含“KeyValuePair.h”的源文件


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

模板的所有代码都位于头文件中,通过
#include
。模板的所有代码都位于头文件中,通过
#include
。模板定义放入头文件,而您没有很好的理由来执行
#include
实现文件。模板定义放入头文件,而您没有很好的理由来执行soA。常见的解决方案是给出不同的解决方案模板实现文件的扩展,例如
.cppt
而不是
.cpp
。这会提醒您为什么要将其包含在标头中,以及为什么makefile不会独立编译它。常见的解决方案是为模板实现文件提供不同的扩展名,例如
.cppt
,而不是
.cpp
。这会提醒您为什么它会包含在头文件中,以及为什么makefile不会单独编译它。