【发布时间】:2014-09-23 06:34:58
【问题描述】:
C++03的显式模板实例化definition和C++11的显式模板实例化declaration有什么区别?
我的意思是为什么实例化定义不足以阻止编译器为其他类型生成实现?下面的例子有什么问题:假设我将模板声明和定义分成两个单独的文件:
啊.h
#pragma once
template<typename T>
class A
{
public:
A(T t);
private:
T _t;
};
A.cpp
#include "A.h"
template<typename T>
A<T>::A(T t) : _t(t) {}
template class A<int>; // explicit instantiation
main.cpp
#include "A.h"
int main()
{
A<int> a(5); // fine, compiler generates header file,
// linker links with implementation from A.cpp file
// A<float> b(3.14f); // linker error, as expected
}
上面的例子中是否有任何编译时间开销?如果我理解正确,在这种情况下,在单独的 *.cpp 文件(以及模板的实现)中使用显式实例化 definition 我会使编译器无法使用任何其他类型隐式实例化模板。因此,为什么显式实例化声明有单独的语法?
如果我已经使用显式实例化定义在 A.cpp 文件中隐藏了实现,并阻止编译器生成正文,那么显式实例化 declaration 如何加快编译时间对于其他类型。 “显式实例化声明”是否与“显式实例化定义”有某种关联,我的意思是我应该同时使用它们,还是这些是完全独立的功能(例如,只有在未使用显式实例化定义时才能使用显式实例化声明)?
我想对了吗,显式实例化定义只是在没有其他翻译单元使用给定类型实例化模板的情况下触发错误?
【问题讨论】:
-
关于模板基础知识的精彩演讲:youtube.com/watch?v=XN319NYEOcE