1. 程式人生 > >C++模板應用——讓模板定義和實現分離的方法

C++模板應用——讓模板定義和實現分離的方法

關於c++中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板程式碼的可讀性,還有就是破壞了面向物件的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。

假設模板程式碼如下:

 1 // 模板定義 a.h
 2 #include <stdio.h>
 3 
 4 template <class tType>
 5 class TTEST
 6 ...{
 7 private:
 8 tType i ;
 9 public:
10 void output();
11 } ;
12 
13 // 模板實現 a.cpp
14 #include "a.h"
15 
16 template<class tType>
17 void TTEST<tType>::output()
18 ...{
19 
20 printf("output: ") ;
21 }
22 
23 // 呼叫模組 test.cpp
24 #include "a.cpp"
25 
26 int main()
27 ...{
28 TTEST<int> t ;
29 t.output();
30 return 1 ;
31 }
複製程式碼


注意呼叫模組test.cpp中,不要包含標頭檔案a.h直接包含a.cpp,這樣就能夠編譯成功。這是由於編譯器要建立 TTEST<int> 這個型別需要模板實現,但從標頭檔案裡沒找到,所以它會認為實現在其它編譯單元中,但它不會報錯,而把找實現部分的工作留給了linker。linker同樣也是找不到實現,因此就不能生成TTEST<int>。上述第一種解決方法直接包含了實現檔案,讓compiler直接找到定義和實現,這樣的效果跟把定義和實現都放在a.h裡是一樣的。
第二中方法,類似第一種,只是test.cpp只包含a.h,然後新增一個檔案impl.cpp內容如下:

 // impl.cpp
 #include "a.cpp"
  template class TTEST<int> ;

如此一來,也能達到定義與實現分離的目的。只是也要包含a.cpp,另外隨著模板例項化不同的型別,impl,cpp中的型別也要跟著改變,有點笨拙的方法

http://www.cnblogs.com/lscheng/archive/2011/10/18/2216569.html

相關推薦

C++模板應用——模板定義實現分離方法

關於c++中類的模板,慣常的用法都是把實現和定義放在標頭檔案裡了事。這樣的問題是,加大了標頭檔案的長度,減低了模板程式碼的可讀性,還有就是破壞了面向物件的隱藏實現的規則。下面就是這種問題的兩個解決方案的總結。 假設模板程式碼如下:  1 // 模板定義 a.h  2 #in

C++模板定義實現分離導致的編譯錯誤

今天在實現一個二叉樹的時候,用到了模板,沒在意,和平時一樣寫了兩個檔案:BinaryTree.h,BinaryTree.cpp。思路和平時一樣,h檔案中定義了模板類,然後在cpp檔案中實現了一些功能函式。 然後在test.cpp中測試,遇到了一些問題、 問題

c/c++模板定義實現分開的問題(一)

注意c/c++模板的定義和實現- -定義一個類一般都是在標頭檔案中進行類宣告,在cpp檔案中實現,但使用模板時應注意目前的C++編譯器還無法分離編譯,最好將實現程式碼和宣告程式碼均放在標頭檔案中。如:test.htemplate<class T>class CT

C++模板類頭文件實現文件分離

證明 about compile strong 驗證 title htm -c itl http://www.cnblogs.com/lvdongjie/p/4288373.html 如何實現C++模板類頭文件和實現文件分離,這個問題和編譯器有關。 引用<<

實現C++模板類標頭檔案實現檔案分離方法

如何實現C++模板類標頭檔案和實現檔案分離,這個問題和編譯器有關。 引用<<C++primer(第四版)>>裡的觀點:1)標準C++為編譯模板程式碼定義了兩種模型:“包含”模型和“分別編譯”模型。2)所有編譯器都支援“包含”模型,某些編譯器支援“

C++中,類函式分開定義宣告實現方法

test.hpp #include <map> #include <queue> #include <string> #include <vector&g

ABI與編譯器:ABI是由內核工具鏈定義實現

51cto 獨立 strong 模塊 返回值 工具 努力 tool 調用 http://book.51cto.com/art/201412/460857.htm 《Linux系統編程(第2版)》第1章入門和基本概念,這一章著眼於Linux系統編程的基礎概念並從程序員視角探索

c++中成員函數指針數組定義初始化方法

fun all turn bsp ati const 成員函數指針 溢出 cat 實際項目中經常遇到很多類似操作,比如命令碼對應執行函數等,對於此類操作,比較好的方式是使用const數組,將命令碼和操作函數綁定在一起,通過查表方式找到操作函數,並執行操作函數。這樣可以簡化代

【轉載】學習C++ -> 類(Classes)的定義實現

人的 博文 有一個 能夠 基本數據 ntp 一是 簡單 空間 一、"類" 的介紹 在C++中, 用 "類" 來描述 "對象", 所謂的"對象"是指現實世界中的一切事物。那麽類就可以看做是對相似事物的抽象, 找到這些不同事物間的共同點, 如自行車和摩托車, 首先他們都屬

介面的定義實現

1、介面和類很相似,介面中,只包含成員和方法。 (1)介面中的成員全是常量成員 public static final,介面中的方法全是抽象方法。 (2)JDK8之前,介面中的方法不需要有修飾符,因為介面中的方法預設全是public型別的方法,不能有靜態方法,但是在JDK8之後,可以定義

非確定有限狀態自動機的構建-NFA的定義實現

保留版權,轉載需註明出處(http://blog.csdn.net/panjunbiao)。 非確定有限狀態自動機(Nondeterministic Finite Automata,NFA)由以下元素組成: 一個有限的狀態集合S 一個輸入符號集合Sigma,並且架設空字元eps

定義實現介面

介面 在繼承中我們講到了介面,那麼如何去定義和實現一個介面呢? 定義一個介面在語法上和定義一個抽象類完全相同,但是不允許提供介面中任何成員的實現方式。 語法規則 定義介面(飛翔) public interface IFly{ public v

C++類內靜態常量定義宣告及enum hack

      本文介紹類內靜態常量定義和宣告的用法,在程式設計時經常遇到需要定義一個常量,而且如果要確保其的有效性在某個範圍內,則需要將其定義在一個class內。而其用法常會遇到一些問題,下面簡要說明其中會遇到的一個問題。

C語言中宣告、定義初始化的區別

函式和變數(全域性變數)都有宣告和定義, 對於函式而言: 同一檔案內,如果函式fun_1呼叫fun_2時,如果fun_2在fun_1之後定義,則需在fun_1之前對fun_2進行宣告,如下: void fun_2();// 宣告 void fun_1() { ... fu

C程式設計--常量(巨集定義const關鍵字定義

說明:(個人總結,有不對之處,還望指正) 常量 常量是固定值,在程式執行期間不會改變。這些固定的值,又叫做字面量。 常量可以是任何的基本資料型別,比如整數常量、浮點常量、字元常量,或字串字面值,也有列舉常量。 常量就像是常規的變數,只不過常量的值在定

go語音之進階篇接口的定義實現以及接口的繼承

結果 只有一個 brush 接口 pack amp nbsp add range 1、接口的定義和實現以及接口的繼承 示例: package main import "fmt" //定義接口類型 type Humaner interface { /

C++初學例程5---類的定義類中方法定義及呼叫

 void Set_weight(int w);//這裡只是對函式的宣告 還沒有實際的定義        //方法的首字母也大寫  //如何在 類的外部定義類中的方法  void Get_height()  {   cout<<"height = "<<height<<"

linux C 結構體struct的定義初始化

struct 定義: struct test { int a; long b; float c; char d; char e[]; }tt1,tt2;//物件宣告列表緊跟struct定義 struct test tt3,tt4;//單獨宣告物件列表 //宣告一個沒結構體名

C#】delegate委託的定義使用方法

using System; namespace delegate委託的定義和使用方法 { class MainClass { //【1】 定義一個返回值是string,無引數的