3

这个问题有很多解决方案机器人没有回答我的情况。

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

地图.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)

4

2 回答 2

4

您已将其map.h纳入map.cppmap.cpp纳入map.h. 包含守卫map.h将防止多次包含map.h并将防止无限递归包含。但是,如果您map.cpp直接向编译器提供数据(这显然是您想要做的),它将包含map.h一次,然后再map.h包含map.cpp一次。这就是导致错误的原因。

如果您想将模板实现为.cpp包含在文件中的.h文件,您可以这样做。这很奇怪,但它可以被迫工作。首先,如果您决定#include使用. 不要直接将您的内容提供给编译器。此外,从该文件中删除。这样做绝对没有意义。map.cppmap.cppmap.cpp#include "map.h".cpp

您的程序将有其他实现文件,例如,myprogram.cpp将使用您的地图。那myprogram.cpp应该包括map.h. 这myprogram.cpp就是您将提供给编译器的内容。这样,它将按预期工作。但是尝试map.cpp直接编译只会导致错误。

不过,一个更好的主意是不要将任何内容放入.cpp文件中。将所有内容都放入.h文件中,或者,如果您真的想以这种方式拆分,请将您的.cpp文件重命名为其他内容,以使所有人清楚这不是翻译单元。

于 2013-07-07T14:54:09.423 回答
1

就我而言,我在定义模板函数的标题顶部错过了一次包含警卫或#pragma。

于 2014-09-30T14:49:44.127 回答