gpt4 book ai didi

C++ 重新定义错误

转载 作者:行者123 更新时间:2023-11-28 07:37:39 25 4
gpt4 key购买 nike

<分区>

我已经搜索了这个问题的答案并尝试了建议的解决方案。即#pragma once#ifndef/#endif。他们没有为我工作。

我遇到的问题是我的代码中的每个函数都被定义了多次。我已经使用 #pragma 试图将 header 包含减少到一次,并且作为一般做法,我总是包含 #ifndef/#endif 在我的头文件中。这两个修复都不起作用,我怀疑这是由于 makefile 的编写方式所致,这也包含在下面。

这是我在编译时收到的错误输出:

BinaryNode.cpp:6:1: error: redefinition of ‘BinaryNode<ItemType>::BinaryNode()’
In file included from BinaryNode.h:35:0,
from BinaryNode.cpp:1:
BinaryNode.cpp:6:1: error: ‘BinaryNode<ItemType>::BinaryNode()’ previously declared here
BinaryNode.cpp:13:1: error: redefinition of ‘BinaryNode<ItemType>::BinaryNode(const ItemType&)’
In file included from BinaryNode.h:35:0,
from BinaryNode.cpp:1:
BinaryNode.cpp:13:1: error: ‘BinaryNode<ItemType>::BinaryNode(const ItemType&)’ previously declared here
BinaryNode.cpp:22:1: error: redefinition of ‘BinaryNode<ItemType>::BinaryNode(const ItemType&, BinaryNode<ItemType>*, BinaryNode<ItemType>*)’
In file included from BinaryNode.h:35:0,
from BinaryNode.cpp:1:
BinaryNode.cpp:22:1: error: ‘BinaryNode<ItemType>::BinaryNode(const ItemType&, BinaryNode<ItemType>*, BinaryNode<ItemType>*)’ previously declared here
BinaryNode.cpp:30:6: error: redefinition of ‘void BinaryNode<ItemType>::setItem(const ItemType&)’
In file included from BinaryNode.h:35:0,
from BinaryNode.cpp:1:

(以此类推,对于下面的实现文件中定义的每个函数。)

头文件(不可修改):

    #ifndef _BINARY_NODE
#define _BINARY_NODE

template<typename ItemType>
class BinaryNode
{
private:
ItemType item; // Data portion
BinaryNode<ItemType>* leftChildPtr; // Pointer to left child
BinaryNode<ItemType>* rightChildPtr; // Pointer to right child

public:
BinaryNode();
BinaryNode(const ItemType& anItem);
BinaryNode(const ItemType& anItem,
BinaryNode<ItemType>* leftPtr,
BinaryNode<ItemType>* rightPtr);

void setItem(const ItemType& anItem);
ItemType getItem() const;

bool isLeaf() const;

BinaryNode<ItemType>* getLeftChildPtr() const;
BinaryNode<ItemType>* getRightChildPtr() const;

void setLeftChildPtr(BinaryNode<ItemType>* leftPtr);
void setRightChildPtr(BinaryNode<ItemType>* rightPtr);
}; // end BinaryNode

这是我的实现文件(可以修改):

#include "BinaryNode.h"
#include <stddef.h>


template<class ItemType>
BinaryNode<ItemType>::BinaryNode()
{
leftChildPtr = NULL;
rightChildPtr = NULL;
}

template<class ItemType>
BinaryNode<ItemType>::BinaryNode(const ItemType& anItem)
{

item = anItem;
leftChildPtr = NULL;
rightChildPtr = NULL;
}

template<class ItemType>
BinaryNode<ItemType>::BinaryNode(const ItemType& anItem, BinaryNode<ItemType>* leftPtr, BinaryNode<ItemType>* rightPtr)
{
item = anItem;
leftChildPtr = leftPtr;
rightChildPtr = rightPtr;
}

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

template<class ItemType>
ItemType BinaryNode<ItemType>::getItem() const
{
return item;
}

template<class ItemType>
bool BinaryNode<ItemType>::isLeaf() const
{
return ((leftChildPtr == NULL) && (rightChildPtr == NULL));
}

template<class ItemType>
BinaryNode<ItemType>* BinaryNode<ItemType>::getLeftChildPtr() const
{
return leftChildPtr;
}

template<class ItemType>
BinaryNode<ItemType>* BinaryNode<ItemType>::getRightChildPtr() const
{
return rightChildPtr;
}

template<class ItemType>
void BinaryNode<ItemType>::setLeftChildPtr(BinaryNode<ItemType>* leftPtr)
{
leftChildPtr = leftPtr;
}

template<class ItemType>
void BinaryNode<ItemType>::setRightChildPtr(BinaryNode<ItemType>* rightPtr)
{
rightChildPtr = rightPtr;
}

此外,这是我的生成文件。我感觉这就是问题所在,但阅读 makefile 一个小时后对我来说不再那么明显了。

lab10: main.o BinaryNode.o
cc -o lab10 main.o

main.o : main.cpp BinaryNode.h
cc -c main.cpp

BinaryNode.o: BinaryNode.cpp BinaryNode.h
cc -c BinaryNode.cpp
clean :
rm *.o *~

还有我的 main.cpp,它现在只是为了让编译器满意:

#include "BinaryNode.h"

int main(int argc, char* argv[])
{



};

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