模板的好处想必大家一定都听说过而且也领教过,不过大家可能会遇见一个让人不高兴的问题,那就是模板的编译,模板虽然流行了很多年,但是就算是很多年过去,还是有不少编译器对模板的支持不是很完善,当然我指的是模板的编译。

      对于模板函数,如果我们像寻常时候写一个class,声明一堆接口,然后在其他地方另行定义,那么我们可能得到编译器一记无情的耳光,告诉我们这些接口没有定义,为什么会这样呢?说到底,就是我们的定义和声明完全没有链接起来,那么对于模板类,我们该怎么定义?其实很简单。就像下面这样:

----------------------------------

#ifndef _BASE_H_

#define _BASE_H_

template<typename T>

class Base{

public:

       f()

       {

             //定义代码;

       }

      g()

      {

             //实现代码;

      }

private:

     T XXX;

};

#endif

-----------------------------------

     通常我是这么使的,并有没分离编译,这种编译模式一般叫做包含模式,这不要是因为我喜欢这样做,而是我使用的编译器本身他们的就不支持分离编译,所以我只能这么做。

     那么怎么分离编译呢?回去看看我们第五十二讲的内容,其实那就是分离编译的方法,不过少一个关键词,那就是export,像下面这样:

--------------------------------------

//Game.cpp
#include "Game.h"

export template<typename T>

Game<T>::Game(int width,int height):

   m_Width(widht),m_Height(height),
   mx(-1),my(-1)

{

       m_Piece = new T*[m_Width];
       for(int i=0;i<m_Width;i++)
             m_Piece[i] = new T[m_High];

}

…………

…………

----------------------------------------

    但是很遗憾,很多编译器并不支持这个export,而且也听说C++11取消了export这个关键词,但是我尝试过在VS2012上并不支持,本来打算试试eclipse和看看的,不过想想也是支持,以前用linux的时候用eclipse他的编译就是用g++编译的,所以如果有朋友用linux的话应该可以分离编译,在使用的时候我们可以直接这样用:

---------------------------------

#include "Game.cpp"

-----------------------------------

     是不是很奇怪呢?include cpp是不是很少见呢,其实很多人认为这是一种极为不好的编程风格,想想也无所谓,template本来就应该是一种开源的编程思想,所以我觉得还是用包含模式吧,虽然看起来好像是麻烦了些,不过好使,哈哈。

 

      这两天公司有点忙,今天还以为更新不了,不过出了点意外,所以提前回来了,明天加班这是没话说的。所以这里留个问题给大家思考 :

      写个模板程序来区分模板和宏的区别。

=================

回复D直接查看目录

你也许也会喜欢