情景1:定义在 h 文件
- File: SourceFile.h
#ifndef SOURCEFILE_H
#define SOURCEFILE_H
#include <iostream>
class SourceFile {
public:
template<typename T>
SourceFile(const char* name, T val) {
std::cout << "SourceFile constructor" << std::endl;
}
};
#endif // SOURCEFILE_H
- File: main.cc
#include "SourceFile.h"
int main() {
SourceFile sf("1.txt", 10); // Compiled OK!
return 0;
}
此时,模板构造函数不需要实例化。
情景2:定义在 cpp 文件
- File: SourceFile.h
// File: SourceFile.h
#ifndef SOURCEFILE_H
#define SOURCEFILE_H
#include <iostream>
class SourceFile {
public:
template<typename T>
SourceFile(const char* name, T val);
};
#endif // SOURCEFILE_H
- File: SourceFile.cc
#include "SourceFile.h"
template<typename T>
SourceFile::SourceFile(const char* name, T val) {
std::cout << "SourceFile constructor" << std::endl;
}
// Explicit instantiations
// 如果定义在 cpp 文件中,必须在 cpp 文件显式实例化模板构造函数
// 否则报错:
// undefined reference to `SourceFile::SourceFile<int>(char const*, int)'
template SourceFile::SourceFile(const char* name, int val); // Required!
- File: main.cc
#include "SourceFile.h"
int main() {
SourceFile sf("1.txt", 10); // Compiled OK!
// ld error:
// undefined reference to `SourceFile::SourceFile<float>(char const*, float)'
SourceFile sfd("2.txt", 1.0f); // ld error!
return 0;
}
此时,必须在 SoureFile.cc 中显式实例化模板构造函数。