Skip to content

CPP模板的实例化

Qiao Longfei edited this page Feb 24, 2018 · 2 revisions

关于模板的实例化:

并不一定一定要看到模板的具体定义,如果在调用的时候,看不到具体定义,会生成一个undefine的调用接口,在连接的时候来找到对应的实例化实现,对模板类和模板函数都是这样。

写一个文件 main.cpp

#include <iostream>

template<typename T> void test(T a);

int main() {
  test<int>(10);
}
# gcc -c Only run preprocess, compile, and assemble steps
gcc -c main.cpp

上面这一步能生成一个正常的main.o,里边有一个符号

nm main.o
U void test<int>(int)

这个符号是未定义的,也就是编译的时候,模板不一定需要实例化,也可以只有一个接口。

但是如果进行链接的话,就会报错

gcc main.cpp

报错:

Undefined symbols for architecture x86_64:
  "void test<int>(int)", referenced from:
      _main in main-22388f.o
ld: symbol(s) not found for architecture x86_64

找不到符号void test<int>(int)。对于class,也有类似的现象。

template<typename T> void test(T a);

template<typename T>
class A {
 public:
  void aa();
};

int main() {
  test<int>(10);
  A<int> a;
  a.aa();
}
Clone this wiki locally