2013-07-07 54 views
3

有很多解決這個問題的機器人沒有回答我的情況。錯誤C2995:函數模板已經定義

我使用VS 2008.I我特林創建地圖使用二叉搜索樹

#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); 
} 

錯誤:對於所有的功能,它說,他們已經被定義。

我下面斯坦福大學在線課程和教師的工作,你還是包括map.hmap.cppmap.cppmap.h(她使用的是Mac)

+1

可能重複的[爲什麼模板只能在頭文件中實現?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-文件) – juanchopanza

+1

這可能是因爲你的IDE試圖用'.cpp'後綴編譯任何東西。 – juanchopanza

+3

你也有一個通告包括。 'map.cpp'不應該包含'map.h'。 – juanchopanza

回答

4

map.h中的包含警衛將防止多重包含map.h,並將防止無限遞歸包含。但是,如果您直接向編譯器提供map.cpp(這正是您顯然要嘗試執行的操作),它將包含map.h一次,然後map.h將再次包含map.cpp本身。這是導致錯誤的原因。

如果你想實現你的模板.cpp文件包含在.h文件,你可以做到這一點。這很奇怪,但它可能被迫工作。首先,如果您決定您的map.cpp,那麼甚至不要嘗試編譯您的map.cpp。不要直接將map.cpp提供給編譯器。另外,從.cpp文件中刪除#include "map.h"。這樣做絕對沒有意義。

你的程序將有其他的實現文件,比如說,myprogram.cpp,它將使用你的地圖。那myprogram.cpp應該包括map.hmyprogram.cpp就是你要提供給編譯器的東西。這樣它將按預期工作。但試圖直接編譯map.cpp只會導致錯誤。

一個更好的主意,雖然不會把任何東西放入.cpp文件。請將所有文件都放入.h文件中,或者如果您確實想要將其分割,請將您的.cpp文件重命名爲其他文件,以便向大家說明這不是翻譯單元。

1

在我的情況下,我錯過了包含守衛或#pragma一次在標題頂部定義模板函數。