博文

目前显示的是 十一月, 2017的博文

c++编译器为什么不支持模板的分离式编译

当我们声明和定义一个模板的时候,必须要让声明和定义放在一个文件里。否则编译器会报错。 这就是为什么boost的实现文件的后缀名是hpp了。 这其中的理由是什么呢?为什么会这样?  <!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"Century Gothic"; panose-1:2 11 5 2 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:647 0 0 0 159 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New...

c++中静态成员变量要在类外部再定义,否则产生link2001错误

c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@testClass@@2HA) int testClass::m_i; int main(int argc, char* argv[]) {   printf("%d\n",testClass::m_i);   printf("\n");   return 0; } 为什么要在类的外部进行定义的原因: 1. 在类中,只是声明了静态变量,并没有定义。 2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。    注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。 3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。    类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。 4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?    静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。    因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。    这会产生两种可能的情况:       A. 重复定义;       B. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。          很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。 ...