c++ - 为什么我不断收到类错误的重新定义?
问题描述
我在编译过程中不断收到重新定义错误,我一直在试图解决这个问题,但我无法解决这个问题。''双节点.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
编译器不断告诉我我重新定义了我的构造函数,我之前做过一个类似的项目,只有一个节点,看起来非常相似,但我没有收到相同的错误。有人可以向我解释我错过了什么或我做错了什么吗?我已经尝试弄清楚重新定义编译错误的含义,但我仍然无法准确指出我在这个项目中做错了什么。我正在尝试创建一个可以向前和向后遍历的节点。
解决方案
不要将 DoubleNode.cpp 编译为独立的编译单元。它不是一个。
类或函数模板的完整定义必须在使用时可用。这意味着类模板定义及其所有成员的定义都必须#include
进入使用该模板的任何编译单元。
这就是#include "DoubleNode.cpp"
DoubleNode.h 末尾的完成。
旁注:此类模板实现文件的常规文件扩展名是 .tpp,而不是 .cpp。我建议将其更改为 DoubleNode.tpp 以避免读者和可能的 IDE 和其他开发工具的混淆。
推荐阅读
- ios - Swift:在swift中应用过滤器时的UIImage方向问题
- git - git log --oneline --all --graph 尽管存在分支,但仅显示线性结构
- arrays - 如何将子矩阵作为参数传递
- swift - 如何在 uimageview 中获得 uiimage 的宽高比大小?
- apache-flink - Apache Flink 中的并行性如何工作?
- java - 并发请求事务以防止不需要的持久性
- list - 尝试将超类对象添加到列表时如何克服列表子类型推断问题?
- android - 使用导航抽屉时后退/向上箭头不起作用
- go - 编译到安卓
- javascript - Firestore 安全规则被拒绝