这个问题有很多解决方案,没有什么能解决我的问题。
我正在使用VS 2008.I tring使用二进制搜索树创建地图
#ifndef _map_h
#define _map_h
#include<string>
using namespace std;
template <typename ValType>
class Map
{
public:
Map();
~Map();
ValType getvalue(string key);
void add(string key,ValType value);
private:
struct node{
string key;
ValType value;
node *right;
node *left;
};
node *root;
node *treeSearch(string key,node *t);
void treeEnter(string key,ValType value,node *&t);
};
#include"map.cpp"
#endif
map.cpp
#include<string>
#include<iostream>
#include"map.h"
using namespace std;
template <typename ValType>
Map<ValType>::Map(){
root=NULL;
}
template <typename ValType>
Map<ValType>::~Map(){
delete root;
}
template <typename ValType>
ValType Map<ValType>::getvalue(string key){
node *found=treeSearch(key,root);
if(found==NULL)
cout<<"Couldnot Found the node";
else return found->value;
}
template <typename ValType>
typename Map<ValType>::node *Map<ValType>::treeSearch(string key,node *t){
if(t==NULL) return NULL;
if(t->key==key) return t;
if(t->key>key) treeSearch(key,t->left);
else treeSearch(key,t->right);
}
template <typename ValType>
void Map<ValType>::add(string key,ValType value){
treeEnter(key,value,root);
}
template <typename ValType>
void Map<ValType>::treeEnter(string key,ValType value,node *&t){
if(t==NULL){
t->value=value;
t->key=key;
t->left=NULL;
t->right=NULL;
}
else if(t->key==key) t->value=value;
else if(t->key>key) treeEnter(key,value,t->left);
else treeEnter(key,value,t->right);
}
错误:对于所有函数,它说它们已被定义。
我正在关注斯坦福大学的在线课程,同样也为教师工作(她使用的是mac)
答案 0 :(得分:4)
您已将map.h
加入map.cpp
和map.cpp
加入map.h
。 map.h
中的包含警戒会阻止多次包含map.h
并阻止无限递归包含。但是,如果您直接向编译器提供map.cpp
(这显然是您要做的),它将包含map.h
一次,然后map.h
将包含map.cpp
本身更多时间。这就是造成错误的原因。
如果要将模板实现为.cpp
文件中包含的.h
文件,则可以执行此操作。这很奇怪,但它可以被迫工作。首先,如果您决定#include
map.cpp
,那么甚至不要尝试编译您的map.cpp
。不要将map.cpp
直接提供给编译器。另外,从#include "map.h"
文件中删除.cpp
。这样做绝对毫无意义。
您的程序将包含其他实施文件,例如myprogram.cpp
,它们将使用您的地图。 myprogram.cpp
应包含map.h
。那个myprogram.cpp
就是你要提供给编译器的东西。这样它就会按预期工作。但是尝试直接编译map.cpp
只会导致错误。
更好的想法是不要将任何内容放入.cpp
文件中。要么将所有内容都放入.h
文件中,或者如果您真的希望将其拆分,请将您的.cpp
文件重命名为其他内容,以便向所有人明确说明这不是翻译单元。
答案 1 :(得分:1)
在我的情况下,我在标题模板功能的标题顶部错过了包含警戒或#pragma一次。