Есть много вариантов решения этого вопроса, но мой ответ ничем не отвечает.
Я использую VS 2008. Я пытаюсь создать карту с помощью бинарного дерева поиска
#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)
Вы включили 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
Перейдите к чему-то другому, чтобы всем было ясно, что это не единица перевода.
В моем случае я пропустил include guard или #pragma один раз в верхней части заголовка, где я определил функцию шаблона.