C++模板類頭文件和實現文件分離
http://www.cnblogs.com/lvdongjie/p/4288373.html
如何實現C++模板類頭文件和實現文件分離,這個問題和編譯器有關。
引用<<C++primer(第四版)>>裏的觀點:1)標準C++為編譯模板代碼定義了兩種模型:“包含”模型和“分別編譯”模型。2)所有編譯器都支持“包含”模型,某些編譯器支持“分別編譯”模型。
問題的提出:(帖子在:http://topic.csdn.net/u/20101215/15/f4f270f2-f0f9-4c5f-8765-1bfde2aeebbf.html)
第一種方法:按C++primer中的“包含”模型,在定義模板類的頭文件中的末行用語句:#include "template_compile.cpp"
在類模板頭文件template_compile.h中:
[cpp] view plaincopyprint?
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
- #include "template_compile.cpp"
在類模板的實現文件template_compile.cpp中:
[cpp] view plaincopyprint?
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
在使用模板的測試文件use_template.cpp中:
[cpp] view plaincopyprint?
- #include<iostream>
- #include "template_compile.h"
- using namespace std;
- void main()
- {
- base<int> bobj;
- cout<<bobj.add_base(2,3)<<endl;
- }
這種方法不能通過編譯,"template_compile.cpp"文件不能"看見"“template_compile.h"文件。
然而:如果我把類模板的實現文件裏代碼放在類模板的頭文件中,註釋掉:#include "template_compile.cpp",編譯和運行不會有任何錯誤。理論上”把類模板的實現文件裏代碼放在類模板的頭文件中“和”在定義模板類的頭文件中的末行用語句:#include "template_compile.cpp" “是一致的,但編譯器就是通不過。
實驗證明:VC9.0不支持C++primer中所說的“包含”模型。
第二種方法:bruceteen提出的:使用define
在類模板頭文件template_compile.h中:
[cpp] view plaincopyprint?
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
- #define FUCK
- #include "template_compile.cpp"
在類模板的實現文件template_compile.cpp中:
[c-sharp] view plaincopyprint?
- #ifdef FUCK
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
- #endif
測試文件不變。
實驗證明:在VC9.0中,這種方法可以實現類模板頭文件和實現文件的分離
方法三:
在類模板頭文件template_compile.h中:
[cpp] view plaincopyprint?
- template<class T>
- class base
- {
- public:
- base() {};
- ~base() {};
- T add_base(T x,T y);
- };
在類模板的實現文件template_compile.cpp中:
[c-sharp] view plaincopyprint?
- #include "template_compile.h"
- template<class T>
- T base<T>::add_base(T x,T y)
- {
- return x+y;
- }
在使用模板的測試文件use_template.cpp中:使用#include "template_compile.cpp"
[c-sharp] view plaincopyprint?
- #include<iostream>
- #include "template_compile.cpp"
- using namespace std;
- void main()
- {
- base<int> bobj;
- cout<<bobj.add_base(2,3)<<endl;
- }
實驗證明:在VC9.0中,這種方法可以實現類模板頭文件和實現文件的分離。
另外實驗證明:VC9.0不支持“分別編譯”模型。
C++模板類頭文件和實現文件分離