關於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)" (
錯誤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