为什么未实例化的模板类编译器不编译呢?
首先要明白,C++中每一个对象所占的空间大小,对象的内存分布都是在编译时期就确定下来的。而对于模板类来说,对象占空间的大小和内存分布是不知道的,依所套用的类型而定,比如A为模板类,则A<int>类对象所占的空间大小和内存分布显然不同于A<double>。(这里插一句,虽然模板类中有一个类字,但是对于实例化的模板类才算是真正的类,未实例化的模板类还不能算是类。)因此,对于未实例化的模板类,编译器无法确定其大小,所以略过对模板类的编译,在编译时只检查一些与模板无关的错误。而此时如果模板类的声明和定义中有错误的话,编译器就检查不到。
模板的错误报告
首先看一个来自《深度探索C++对象模型》中的例子,在vs2010下编译
template <class T>
class Mumble
{
public$ :
Mumble(T t = 1024) :_t(t)
{
tt = 1023;
if (tt != t)
throw std::exception("wrong answer") std::exception("wrong answer")
}
static void doMumble();
void hehe();
private:
T tt;
}
显然编译错误,两个明显的错误是public标示符打错以及类的声明未以分号结束。现在把这两个错误更改,如下
template <class T>
class Mumble
{
public :
Mumble(T t = 1024) :_t(t)
{
tt = 1023;
if (tt != t)
throw std::exception("wrong answer") std::exception("wrong answer")
}
static void doMumble();
void hehe();
private:
T tt;
};
这时,编译成功。(请注意,这时我并未实例化Mumble)。其实这个类中依然还有很多错误,如下
-
t以一个