(若转载,请注明原出处与作者,作者:Witton)

        由于工作的原因,自己写的代码,需要跨平台运行(windows与Linux),但是由于VC编译器与gcc/g++编译器的差别,有的代码,在VC下面编译OK,在Linux下却未必编译得过,下面就是一个典型的例子: 请先看一下下面的一段代码是否有问题:

 1#include <iostream>
 2using namespace std;
 3template <typename T>
 4class CT
 5{
 6public:
 7
 8 static void StaticInit()
 9 {
10   pInstance = new T;
11   assert(pInstance);
12 }
13 static void StaticDestroy()
14 {
15   delete pInstance;
16 }
17 static T* Instance()
18 {
19   assert(pInstance);
20   return pInstance;
21 };
22protected:
23 static T* pInstance;
24 CT( void )
25 {
26 }
27 virtual ~CT( void )
28 { 
29 }
30};
31
32class CTestClass : public CT<CTestClass>
33{
34private:
35 CTestClass();
36 
37 friend class CT;
38};
39
40CTestClass * CT<CTestClass>::pInstance = NULL;```
41
42
43
44
45上面这段代码,在VC环境下编译是完全没有问题的;但是在Linux下编译就会有问题 
46
47friend class CT这一行会报错: 
48 template argument required for `class CT' 
49 friend declaration does not name a class or function 
50 在最后一行代码处会报错:too few template-parameter-lists 
51 为了让所写的代码既能在Windows下编译通过,也能在Linux下编译通过,就需要作如下修正: 
52
53friend class CT改成friend class CT<CTestClass> 
54 在最后一行的前一行加上template<>   
55