跨平台模板的写法
(若转载,请注明原出处与作者,作者: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
47在friend 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
53将friend class CT改成friend class CT<CTestClass>
54 在最后一行的前一行加上template<>
55
- 原文作者:Witton
- 原文链接:https://wittonbell.github.io/posts/2007/2007-04-30-跨平台模板的写法/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。