1. 程式人生 > >關於C++泛型程式設計,模板宣告和定義最好在同一個檔案的解釋。

關於C++泛型程式設計,模板宣告和定義最好在同一個檔案的解釋。

關於C++泛型程式設計 模板的 宣告和實現 不能分離的原因:
1.泛型-模板 template
2.模板不是變數,模板就是模板。
3.模板需要例項化成類,就像是行內函數進行替換一樣,替換模板變數 template<typename  T>
4.編譯過程 
       類的編譯過程  類 例項化成 物件
  模板的編譯過程 模板 替換模板變數  特例化成 類 類再例項化成 物件
5.宣告 和 定義 分離的 後果
  宣告 了模板 我們 使用這個模板的時候 會#include"模板.h"
  此時編譯器 1.會根據我們代入的 模板變數型別 進行替換,但是此時只是替換了 .h標頭檔案裡面 的typename T
             模板.cpp實現檔案 裡面的 typename T並沒有被替換。
2.開始編譯,編譯.h並沒有錯,不過找不到 類實現檔案。會在連結link 目標檔案的時候 去.cpp編譯成.obj的時候 查詢 具體實現。
3.由於 模板.cpp裡面的 typename T是沒有被替換的,沒有特例化成類,所以直接報錯: 無法解析外部符號,無法解析外部命令。(因為沒有類的實現)
例子:

     (錯誤版本)

main.cpp

#include<iostream>
#include"myTemplate.h"
using namespace std;
int main(int argc, char * argv[])
{
	myTemplate<int, float> * p = new myTemplate<int, float>(12, 12.0);
	cout << p->plus()<< endl;
	cin.get();
}

模板宣告

myTemplate.h
#ifndef _MYTEMPLATE_H_
#define _MYTEMPLATE_H_
template<typename T,typename V>
class myTemplate{
private:
	T m_x;
	V m_y;
public:
	myTemplate(T x, V y);
public:
	T plus();
};
#endif
模板實現

myTemplate.cpp

#include"myTemplate.h"
template<typename T,typename V>
myTemplate<T,V>::myTemplate(T x, V y)
{
	this->m_x = x;
	this->m_y = y;
}
template<typename T, typename V>
T myTemplate<T,V>::plus()
{
	return (T)(this->m_x + this->m_y);
}

編譯結果:
 錯誤3error LNK1120: 2 個無法解析的外部命令F:\VisualStudio2013UltimateProjects\template\Debug\template.exetemplate
錯誤1error LNK2019: 無法解析的外部符號 "public: __thiscall myTemplate<int,float>::myTemplate<int,float>(int,float)" (
[email protected]
@@[email protected]@Z),該符號在函式 _main 中被引用F:\VisualStudio2013UltimateProjects\template\template\template.objtemplate
錯誤2error LNK2019: 無法解析的外部符號 "public: int __thiscall myTemplate<int,float>::plus(void)" ([email protected][email protected]@@QAEHXZ),該符號在函式 _main 中被引用F:\VisualStudio2013UltimateProjects\template\template\template.objtemplate

(正確版本)
main.cpp

#include<iostream>
#include"myTemplate.h"
using namespace std;
int main(int argc, char * argv[])
{
	myTemplate<int, float> * p = new myTemplate<int, float>(12, 12.0);
	cout << p->plus()<< endl;
	cin.get();
}
模板宣告和實現在同一個檔案
myTempalte.h
#ifndef _MYTEMPLATE_H_
#define _MYTEMPLATE_H_
template<typename T,typename V>
class myTemplate{
private:
	T m_x;
	V m_y;
public:
	myTemplate(T x, V y);
public:
	T plus();
};


template<typename T, typename V>
myTemplate<T,V>::myTemplate(T x, V y)
{
	this->m_x = x;
	this->m_y = y;
}
template<typename T, typename V>
T myTemplate<T,V>::plus()
{
	return (T)(this->m_x + this->m_y);
}


#endif


執行結果:
24

相關推薦

關於C++程式設計模板宣告定義最好在同一個檔案解釋

關於C++泛型程式設計 模板的 宣告和實現 不能分離的原因: 1.泛型-模板 template 2.模板不是變數,模板就是模板。 3.模板需要例項化成類,就像是行內函數進行替換一樣,替換模板變數 template<typename  T> 4.編譯過程     

C++程式設計:函式模板與類模板

泛型程式設計是一種語言機制,通過他可以實現一個標準的容器庫,可以處理不同的資料型別. 比如對棧的描述: class stack { push(引數型別)//入棧 pop(引數型別)//出棧 } 由於上面的程式碼與資料型別有關,可以通過模板實現一個程式碼處理不同的資料型別。 首先執行一種通

C++Primer_Chap16_模板程式設計_List02_模板實參推斷_筆記

  從函式實參類確定模板實參的過程稱為模板實參推斷(template argument deduction)。 型別轉換和模板型別引數   如果一個函式形參的型別使用了模板型別引數,那麼它採用特殊的初始化規則。只有很有限的幾種型別轉換會自動應用於這些實參。編譯器通常不是對

C++Primer_Chap16_模板程式設計_List05_模板特例化_筆記

  編寫單一模板,使之對任何可能的模板實參都是最合適的,都能例項化,這並不總是能辦到的。當我們不能(或不希望)使用模板版本時,可以定義類或函式模板的一個特例化版本。 定義函式模板特例化   當我們特例化一個函式模板時,必須為原模板中的每個模板引數都提供實參。為了指出我們正

C++模板初階(程式設計函式模板模板)

1.泛型程式設計 怎麼實現一個通用的交換函式呢 使用函式過載雖然可以實現,但是有一下幾個不好的地方: 1. 過載的函式僅僅只是型別不同,程式碼的複用率比較低,只要有新型別出現時,就需要增加對應的函式 2. 程式碼的可維護性比較低,一個出錯可能所有的過載均出錯

C++程式設計學習(三)——類模板

目錄 目錄 前言 類模板例項 類模板小結 總結 前言 C++泛型程式設計學習(二)——類模板中已經介紹瞭如何在一個檔案中,把類模板的方法和實現分開,這裡主要記錄下類模板的宣告和定義分別寫在標頭檔案中的方法。 類模板例項 功能:實現一

C++程式設計 快速排序的函式模板實現

說在前面的廢話 話說快一年沒寫過部落格了。。。 在建站之前就先用csdn寫吧 這次要說的東西也沒有啥,主要是想寫一次快排(學了這麼就快排都沒寫過你敢信 用法類似於stl裡面的sort,有兩個版本。 不知道為什麼寫了很長時間。。。這麼短的程式碼 還是感

C#中的抗變協變

cep 就是 idt oid pre set 協變 nbsp 通過 在.net4之前,泛型接口是不變的。.net4通過協變和抗變為泛型接口和泛型委托添加了一個重要的拓展 1、抗變:如果泛型類型用out關鍵字標註,泛型接口就是協變的。這也意味著返回類型只能是T。 實例:

c++ 程式設計

C++ 泛型程式設計與STL模板庫(1)---泛型程式設計簡介及STL簡介與結構 泛型程式設計的基本概念 編寫不依賴於具體資料型別的程式 將演算法從特定的資料結構中抽象出來,成為通用的 C++的模板為泛型程式設計奠定了關鍵的基礎 術語:概念 用來界定具備一

程式設計模板

#include <iostream> #include <vector> using namespace std; template<typename T> class MyStack { public: MyStack(); ~M

C++程式設計

面向物件程式設計關注資料,泛型程式設計關注演算法。 模板和迭代器:都是STL通用方法的組成部分,模板讓演算法獨立於資料型別,迭代器讓演算法獨立於容器型別。例如,對於在陣列和在連結串列中查詢特定值節點的find函式,模板提供了儲存在容器中的資料型別的通用表示,還需要提供遍歷容

C/C++ 程式設計vector(排序)

題目描述 對一組輸入的資料(0結束)進行排序輸出。 約定:所有的輸入資料都為正整數,且都不大於100000。 輸入 包括多組測試資料。 每組以0結尾。 輸出  每組輸出1行。輸出排序後的資料(不含0)。 樣例輸入 1 2 3 2 4 0 5 6 2 2 0

C/C++ 程式設計stack(括號匹配)

題目描述 假設表示式中包含一種括號:圓括號,其巢狀順序隨意,即(()())或(())等為正確的格式,)(或((())或())均為不正確的格式。檢驗括號是否匹配可以用堆疊來實現當遇到 ( 時進棧,遇到 ) 時出棧進行匹配檢驗,如果出現不匹配的情況立即結束,否則繼續取下一個字元

C++ 程式設計(單詞數)

題目描述 lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 輸入 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,每

C++ 程式設計(國名排序)

題目描述 問題描述:小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要儘快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎? 例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國 。 輸入 第1行為一個n(n&

程式設計-函式模板

template < typename T >void Swap(T& a, T& b){    T c = a;    a = b;    b = c;} 隱式呼叫: int

[C++]程式設計的基礎問題

例如有一個 min 函式,我們希望它相對型別是獨立的,也就是說任何類/型別都可以呼叫這個函式。如果是一個整型的數,通常我們可以這樣寫: int min(const int & a,const int &b) { return a<b?a:b; } 為了讓它適用於多個類,我們知

C# 約束函式

   class 泛型     {         public static void Main()         {             //---------------測試泛型約束-------             //定義一個Pression陣列     

C++ 程式設計vector(成績排序)

題目描述 定義學生結構體,包括學號、及三門功課的成績和總分,按照總分從小到大輸出學生學號、總分和各門功課的成績。如果總分相同,就按第1門課的分數小到大輸出;如果第1門課的分數相同,就按第2門課的分數小到大輸出; 輸入 輸入包含n(n<20)個學生的資訊, 第1行學

C++函式模板宣告定義分離的方法

    廢話不說,先上程式碼。 // template_test.h template <class T> T MyMax(T a,T b); template float MyMax(float a,float b); template int MyMax(i