错误C2995:已定义功能模板

时间:2013-07-07 14:16:50

标签: c++ templates visual-c++

这个问题有很多解决方案,没有什么能解决我的问题。

我正在使用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)

2 个答案:

答案 0 :(得分:4)

您已将map.h加入map.cppmap.cpp加入map.hmap.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一次。