ошибка C2995: шаблон функции уже определен

Есть много вариантов решения этого вопроса, но мой ответ ничем не отвечает.

Я использую 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)

3

Решение

Вы включили 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 Перейдите к чему-то другому, чтобы всем было ясно, что это не единица перевода.

4

Другие решения

В моем случае я пропустил include guard или #pragma один раз в верхней части заголовка, где я определил функцию шаблона.

1

По вопросам рекламы [email protected]