求解C++模板与LNK2005 ***obj 已经定义的问题

stephenchen45 2006-10-10 04:45:59
我定义了一个模板类A,然后在另一个类B中实例化那个A,编译没有问题,但是运行的时候就出现了问题,我贴出部分代码吧。。。

Chain 模板类
template<class DataType>
class Chain
{
private:
ChainNode<DataType> *first;
public:
Chain(void);
Chain(Chain<DataType> ©);
bool IsEmpty() const {return first==0;}
int Length() const;
bool Find(int k,DataType& x) const;
int Search(const DataType& x) const;
Chain<DataType>& Delete(int k,DataType& x);
Chain<DataType>& Insert(int k,const DataType x);
void Sort() ;
void Clear() ;
void Output(ostream& out) const;
void Combination(const Chain& a,const Chain<DataType>& b);
//friend ostream& operator << (ostream& out,Chain<DataType>& x); //采用函数的方式调用可以不用友元
public:
~Chain(void);
};


Interface类
#pragma once
#include<iostream>
#include"Chain.cpp"
using namespace std;

class Interface
{
public:
Interface(void);
void List_Manipulation(Chain<int> &List);
void Search(const Chain<int> &List) const;
void GetLength(const Chain<int> &List) const;
void Combine(const Chain<int> &List) const;
void Output(const Chain<int> &List) const;
void Operation();
public:
~Interface(void);
};

在头文件那里,我在Interface类里面是调入#include"Chain.cpp"的,
在Interface的一些函数里面是有定义一个Chain<int>的类,但是不知道
为什么在编译的时候没有问题,却在运行的时候会出现下面的一些错误:
错误 1 error LNK2005: "public: __thiscall Interface::Interface(void)" (??0Interface@@QAE@XZ) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 2 error LNK2005: "public: __thiscall Interface::~Interface(void)" (??1Interface@@QAE@XZ) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 3 error LNK2005: "public: void __thiscall Interface::GetLength(class Chain<int> const &)const " (?GetLength@Interface@@QBEXABV?$Chain@H@@@Z) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 4 error LNK2005: "public: void __thiscall Interface::Output(class Chain<int> const &)const " (?Output@Interface@@QBEXABV?$Chain@H@@@Z) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 5 error LNK2005: "public: void __thiscall Interface::Search(class Chain<int> const &)const " (?Search@Interface@@QBEXABV?$Chain@H@@@Z) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 6 error LNK2005: "public: void __thiscall Interface::Operation(void)" (?Operation@Interface@@QAEXXZ) 已经在 Interface.obj 中定义 LinkStruct.obj
错误 7 fatal error LNK1169: 找到一个或多个多重定义的符号 E:\MyProjects\List_Linked\Debug\List_Linked.exe


这个问题已经困扰了好多天,上网也查不到相关的资料。。。
望各位大虾指点一下。。。
...全文
852 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2006-10-11
  • 打赏
  • 举报
回复
请重建工程。你现在的工程里有东西没清干净。
a_b_c_abc1 2006-10-10
  • 打赏
  • 举报
回复
当一个CPP文件被另一个CPP文件包含,或者头文件中有非模板类函数的定义(而不仅是声明)时被多个CPP文件包含,会出现这种错误。
可以把你工程中所有文件的包含关系发上来看看,函数体的实现清空。
Could 2006-10-10
  • 打赏
  • 举报
回复
在你的chain.h最前面加上
#pragma once
stephenchen45 2006-10-10
  • 打赏
  • 举报
回复
把你的chain.cpp改名为chain.h。并且从工程里把chain.cpp移除。


我试过这种方法,行不通,还是照样地报错刚才那样的错误。。。
stephenchen45 2006-10-10
  • 打赏
  • 举报
回复
我是用VS2005的,ChainNode是另一个类,我写的类都是声明和定义分开的,Chain是个用链表实现的线性表,我是用模板实现的,如果将将#include"Chain.cpp"改成Chain.h的话就会报错说,重复定义或者包含之类的错误提示。我上网和看过一些资料,如果用模板的话一般都不能重复包含模板类的头文件,所以我才用#include"Chain.cpp"。。。。不知道大家还有什么办法呢?
taodm 2006-10-10
  • 打赏
  • 举报
回复
呃,把你的chain.cpp改名为chain.h。并且从工程里把chain.cpp移除。
飞哥 2006-10-10
  • 打赏
  • 举报
回复
第一。#include“。cpp”这个太不正规了
第二。没发现什么问题,不知道你的ChainNode哪定义的
第三。通常这种错误都是在定义头文件不规范时出现
sinall 2006-10-10
  • 打赏
  • 举报
回复
给每个头文件

#ifndef XXXX_H
#define XXXX_H

#endif
包起来
stars0913 2006-10-10
  • 打赏
  • 举报
回复
#include"Chain.cpp" ???
chain.cpp中是否还有具体的类定义
最好还是包含chain.h比较好, 声明和定义分开
Could 2006-10-10
  • 打赏
  • 举报
回复
中文版的?
哪有下的?

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧