无法链接C++代码

Unable to Link C++ Code

本文关键字:代码 C++ 链接      更新时间:2023-10-16

我在同一目录中有以下三个文件:

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

任何想法或见解都将不胜感激!

在头文件中定义模板化类的所有内容,而不是在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;
};

以下是常见问题解答中的相关阅读。。。

编辑:(但您以后也可以像在头文件中的cpp中那样定义它…)

模板函数必须完全写在头上,它们的定义不能放在cpp文件上。