我在同一目录中有以下三个文件:
citysim.cpp
#include "utils.h"
using namespace std;
int main()
{
City *c;
c = new City();
Graph<City *> g;
g.addVertex(c);
}
utils.h
#include <iostream>
#include <map>
#include <vector>
using namespace std;
class City {
public:
City() {}
private:
string name;
};
template <typename Tkey>
class Graph {
public:
Graph() {}
void addVertex(Tkey);
private:
vector<Tkey> v;
vector< vector<int> > e;
map<Tkey, int> key_map;
};
utils.cpp
#include "utils.h"
template <typename Tkey>
void Graph<Tkey>::addVertex(Tkey vertex)
{
v.push_back(vertex);
}
我真的很困惑为什么以下编译序列产生了指示的结果:
test> g++ -c citysim.cpp
test> g++ -c utils.cpp
test> g++ -o citysim citysim.o utils.o
citysim.o: In function `main':
citysim.cpp:(.text+0x4a): undefined reference to `Graph<City*>::addVertex(City*)'
collect2: ld returned 1 exit status
感谢任何想法或见解!
答案 0 :(得分:1)
在头文件中定义模板化类的所有内容,而不是在cpp文件中定义。而不是让你的utils.cpp在你的头文件中包含这样的一切:
template <typename Tkey>
class Graph {
public:
Graph() {}
void addVertex(Tkey vertex)
{
v.push_back(vertex);
}
private:
vector<Tkey> v;
vector< vector<int> > e;
map<Tkey, int> key_map;
};
Here是常见问题中的相关阅读...
编辑: (但是您可以稍后定义它,就像您在头文件中的cpp中所做的那样...)
答案 1 :(得分:0)
模板函数必须完全写在标题上,它们的定义不能放在cpp文件中。