C++中模板类的编译过程

为什么未实例化的模板类编译器不编译呢?

首先要明白,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)。其实这个类中依然还有很多错误,如下

  1. t以一个
  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值