gpt4 book ai didi

c++ - 为什么要不断重新定义类错误?

转载 作者:行者123 更新时间:2023-12-01 14:43:12 25 4
gpt4 key购买 nike

在编译过程中,我一直收到重新定义错误,我一直在试图解决它,但我无法解决问题。
''DoubleNode.h''

#ifndef DOUBLENODE_
#define DOUBLENODE_

template<class ItemType>
class DoubleNode
{
private:
ItemType item;
DoubleNode<ItemType>* next; // Pointer to next node
DoubleNode<ItemType>* previous; // Pointer to previous node

public:
DoubleNode(); // Default Constructor
DoubleNode(const ItemType& anItem); // Parameterized Constructor
DoubleNode(const ItemType& anItem, DoubleNode<ItemType>* nextNodePtr, DoubleNode<ItemType>* previousNodePtr);
void setItem(const ItemType& anItem);
void setNext(DoubleNode<ItemType>* nextNodePtr);
void setPrevious(DoubleNode<ItemType>* previousNodePtr);
ItemType getItem() const ;
DoubleNode<ItemType>* getNext() const ;
DoubleNode<ItemType>* getPrevious() const ;
}; // end Node

#include "DoubleNode.cpp"
#endif

''DoubleNode.cpp''
#include "DoubleNode.h"
//#include <cstddef>

template<class ItemType>
DoubleNode<ItemType>::DoubleNode() : next(nullptr), previous(nullptr)
{
}

template<class ItemType>
DoubleNode<ItemType>::DoubleNode(const ItemType& anItem) : item(anItem), next(nullptr), previous(nullptr)
{
} // end constructor

template<class ItemType>
DoubleNode<ItemType>::DoubleNode(const ItemType& anItem, DoubleNode<ItemType>* nextNodePtr, DoubleNode<ItemType>* previousNodePtr) :item(anItem), next(nextNodePtr), previous(previousNodePtr)
{
} // end constructor

template<class ItemType>
void DoubleNode<ItemType>::setItem(const ItemType& anItem)
{
item = anItem;
} // end setItem

template<class ItemType>
void DoubleNode<ItemType>::setNext(DoubleNode<ItemType>* nextNodePtr)
{
next = nextNodePtr;
} // end setNext

// set previous pointer
template<class ItemType>
void DoubleNode<ItemType>::setPrevious(DoubleNode<ItemType>* previousNodePtr)
{
previous = previousNodePtr;
}

template<class ItemType>
ItemType DoubleNode<ItemType>::getItem() const
{
return item;
} // end getItem

template<class ItemType>
DoubleNode<ItemType>* DoubleNode<ItemType>::getNext() const
{
return next;
} // end getNext

template<class ItemType>
DoubleNode<ItemType>* DoubleNode<ItemType>::getPrevious() const
{
return previous;
} // end getNext

编译器不断告诉我,我重新定义了构造函数,之前我只做过一个节点就完成了一个类似的项目,该项目看起来非常相似,但是没有收到相同的错误。有人可以向我解释我所缺少的或我做错的吗?我试图弄清楚重定义编译错误的含义,但我仍然无法确切指出我在该项目中做错了什么。我正在尝试创建一个节点,该节点可以向前和向后移动。

最佳答案

不要将DoubleNode.cpp编译为独立的编译单元。这不是一个。

类或函数模板的完整定义必须在使用时可用。这意味着类模板定义及其所有成员的定义都必须将#include d放入使用该模板的任何编译单元中。

这就是DoubleNode.h结尾处的#include "DoubleNode.cpp"完成的工作。

旁注:这种模板实现文件的常规文件扩展名是.tpp,而不是.cpp。我建议您将其更改为DoubleNode.tpp以避免混淆,无论是读者还是IDE以及其他开发工具。

关于c++ - 为什么要不断重新定义类错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60957100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com