首页 > 解决方案 > 为什么我不断收到类错误的重新定义?

问题描述

我在编译过程中不断收到重新定义错误,我一直在试图解决这个问题,但我无法解决这个问题。''双节点.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

''双节点.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

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

标签: c++nodes

解决方案


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

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

这就是#include "DoubleNode.cpp"DoubleNode.h 末尾的完成。


旁注:此类模板实现文件的常规文件扩展名是 .tpp,而不是 .cpp。我建议将其更改为 DoubleNode.tpp 以避免读者和可能的 IDE 和其他开发工具的混淆。


推荐阅读