错误C2995:已定义函数模板
error C2995:function template has already been defined
这个问题有很多解决方案,但没有什么能回答我的问题。
我正在使用VS2008.我正在字符串创建一个使用二进制搜索树的地图
#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)
您已将map.h
包含在map.cpp
中,将map.cpp
包含在map.h
中。map.h
中的include保护将防止map.h
的多次包含,并将防止无限递归包含。但是,如果您将map.cpp
直接提供给编译器(这显然是您想要做的),它将包含map.h
一次,然后map.h
将再包含map.cpp
本身一次。这就是导致错误的原因。
如果您想将模板实现为包含在.h
文件中的.cpp
文件,您可以这样做。这很奇怪,但它可以被迫工作。首先,如果您决定将#include
编译为map.cpp
,那么甚至不要尝试编译map.cpp
。不要将map.cpp
直接提供给编译器。另外,从.cpp
文件中删除#include "map.h"
。这样做毫无意义。
您的程序将有其他实现文件,比如myprogram.cpp
,它将使用您的映射。myprogram.cpp
应该包括map.h
。myprogram.cpp
就是您将要提供给编译器的内容。这样,它将按预期工作。但是尝试直接编译map.cpp
只会导致错误。
不过,最好不要在.cpp
文件中放入任何内容。将所有内容放入.h
文件中,或者,如果您真的想以这种方式拆分,请将.cpp
文件重命名为其他文件,以向所有人表明这不是一个翻译单元。
在我的例子中,我在定义模板函数的标头顶部错过了一次include guards或#pragma。
相关文章:
- 仅在函数模板中为那些定义了函数的类型执行函数
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 使用定义函数模板别名
- 何时需要实例化函数模板定义?
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 定义类模板构造函数的两种方法之间的区别
- 使用表达式 SFINAE 的函数模板的类外定义
- 如何为自定义模板对象创建专门的函数模板
- 我应该声明我的函数模板专业化还是定义它们就足够了
- 使用用户定义的转换运算符推导函数模板参数
- 如何定义函数模板中使用的函数?
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 错误:重新定义函数模板(或 C2995)
- 调用标头中定义的模板函数时C++链接器错误
- 模板中的自定义函数C++
- 如何严格定义函数模板显式实例化规则
- 定义函数模板
- 错误C2995:已定义函数模板