1. 程式人生 > >模板類,模板類函式特例化,模板類特例化

模板類,模板類函式特例化,模板類特例化

今天在看某c++框架原始碼時,發現模板類裡的部分函式可以特例化,感覺很神奇便嘗試了下,發現很多平時不會注意的c++細節及知識,寫下來分享給大家,以便大家遇到相似問題時可以少踩點坑。

  1. 模板類會出現連結問題,編譯不通過
    如果模板類.h檔案和.cpp檔案分開存放,然後編譯的時候會提示連結錯誤,無法生產exe檔案,具體的原因可以參看編譯原理。
    決解辦法:1 .h檔案和.cpp檔案合成一個檔案
    2 在使用該類模板處包含.cpp檔案即可.

  2. 模板類部分函式特例化

template<typename T> class test
{
public:
    test(){};
    ~test(){};
    void
gohome(); void gogo(); };
template<typename T> void test<T>::gogo(){
    cout << "gogo" << endl;
}
template<> void test<int>::gohome(){
    cout << "int" << endl;
}


template<> void test<double>::gohome(){
    cout << "double"
<< endl; }

這個時候編譯會出現錯誤錯誤 3 error LNK1169: 找到一個或多個多重定義的符號
如果把包含的.cpp檔案刪除後又會提示連結錯誤,是個兩難的問題。
解決辦法:

template<typename T> void test<T>::gogo(){
    cout << "gogo" << endl;
}
template<> void test<int>::gohome(){
    cout << "int" << endl;
}


template
<> void test<double>::gohome(){ cout << "double" << endl; } // template class test<double>; template class test<int>;

特例化需要使用這個模板類會例項化的所有例項,然後就可通過編譯,並且成功執行。
這樣做的好處是:只允許使用者例項化部分,而並非可以例項化任何例項化,從而約束使用者行為。

相關推薦

模板中的成員函式定義返回值為中的typedef型別時候注意

如果模板類中的成員要訪問類中的typedef型別必須加上關鍵字typename來指明它是一個型別。 如一下程式碼中的那個成員函式size。 #include <iostream> #include <string> template&

Java繼承預設在建構函式中用super()呼叫父建構函式

public class Testing_animal {public static void main(String[] args) {//狗類繼承Animal類//初始化時呼叫建構函式就輸出了小黃的動物種類Dog xiaohuang=new Dog("小黃");//呼叫Dog的speak函式,在speak

出現身份驗證錯誤要求的函式不支援導致遠端桌面無法連線的問題

首先修改加密Oracle 另把一下程式碼編輯成cmd格式的檔案後以管理員執行即可。 @echo off pushd "%~dp0" dir /b C:\Windows\servicing\Packages\Microsoft-Windows-Gro

Windows10遠端報錯: 出現身份驗證錯誤要求的函式不正確這可能是由於CredSSP加密Oracle修正

"Win10家庭版" 要用方法二方法一:執行 gpedit.msc本地組策略:計算機配置>管理模板>系統>憑據分配>加密Oracle修正選擇啟用並選擇易受攻擊。 方法二 修改伺服器端登錄檔資訊,或直接新建 .reg 檔案複製下面的內容,雙擊執行。Win

Scala方法定義方法和函式的區別將方法轉換成函式

1. 定義方法和函式 1.1. 定義方法 方法的返回值型別可以不寫,編譯器可以自動推斷出來,但是對於遞迴函式,必須指定返回型別 1.2. 定義函式 1.3.方法和函式的區

模板特例模板函式特例

template<class T> class Test { public:  void out()  {   cout <<myT.t;  } private:  T my

模板模板函式特例模板特例

今天在看某c++框架原始碼時,發現模板類裡的部分函式可以特例化,感覺很神奇便嘗試了下,發現很多平時不會注意的c++細節及知識,寫下來分享給大家,以便大家遇到相似問題時可以少踩點坑。 模板類會出現連結問題,編譯不通過 如果模板類.h檔案和.cpp檔案

模板預設引數模板的特偏特 模板成員函式模板的專用例子

#include "stdio.h" #include "stdlib.h" #include <typeinfo> #include <iostream> using namespace std; class Sample2 { public:

C++模板的特詳解(函式模版特殊模版特

模版與特化的概念 函式模版與類模版 C++中模板分為函式模板和類模板 函式模板:是一種抽象函式定義,它代表一類同構函式。 類模板:是一種更高層次的抽象的類定義。 特化的概念 所謂特化,就是將泛型的東東搞得具體化一些,從字面上

C++模板的特函式模板模板)與例項區別聯絡

一:例項化什麼是例項化:一個通過使用具體值替換模板引數,從模板產生的普通類,函式的過程1.顯示例項化:通過指定的型別,表明要例項化的型別2.隱式例項化:通過編譯器自己推演,判斷出要例項化的型別 二 :特

模板內宣告外定義的函式外定義時沒加模板時的報錯

錯誤 1 error LNK2019: 無法解析的外部符號 "public: int __thiscall SqList<class StuTab>::getLength(void)" ([email protected][email protected]@@@@QAEHXZ)

模板中使用友元函式的方式派生友元函式對基的成員使用情況

在一般友元函式的前面加上 template<typename T),注意在函式的宣告和定義處都要加這個模板 例如: //模板類,長方體類 template <typename ElementType> class Rectangle { ///*過載基類的輸入輸出運算子*/

模板的特偏特

template <typename T1, typename T2> class MyClass { ... }; 以下數種形式的偏特化都是合理的: // 偏特化:兩個 template parameter 相同 template <typename T> class MyClas

大資料之scala(三) --- 的檢查、轉換、繼承檔案特質trait操作符applyupdateunapply高階函式柯里控制抽象集合

一、類的檢查和轉換 -------------------------------------------------------- 1.類的檢查 isInstanceOf -- 包括子類 if( p.isInstanceOf[Employee]) {

關於模板中友元函式的宣告與定義

//Widget.h #ifndef _WIDGET_H_ #define _WIDGET_H_ #include <iostream> using namespace std; template<class T> class Widget {

什麼是虛擬函式虛擬函式和普通函式有何不同帶有虛擬函式什麼時候都可以例項嗎?

程式碼或者內容有任何問題,請留言相告,不勝感激!!!!! 什麼是虛指標? 虛指標又叫虛擬函式指標是一個虛擬函式的實現細節,帶有虛擬函式的類中每一個物件都有一個虛指標指向該類的虛擬函式表 虛擬函式的入口地址和普通函式的入口地址有什麼不同? 每個虛擬函式都在虛表中佔有一個表項

C++模板中的友元函式的宣告和定義分別放在哪裡

        前面提到了模板的宣告和定義推薦都放在標頭檔案中,那麼該類中的友元函式的宣告和定義該放在哪裡呢?         因為友元函式並不屬於這個類, 按照習慣,我們一般把宣告放在類中,而把定義放在類的外面。但對於類模板來說,這樣就出問題了。很多編譯器並不支援將友元函

模板與友元函式

模板的友元可以分為三類: 非模板友元約束模板友元,即友元的型別取決於類被例項化時的型別非約束模板友元,即友元的所有具體化都是類的每一個具體化的友元 1. 模板類的非模板友元,即該友元函式不存在模板,但是該友元函式聲明於一個模板類中。 圖1 如果沒有需要模板類引數,這與

c++---非型別的模板引數、模板的特模板的分離編譯

一. 非型別的類模板函式 在類的模板引數列表中,不一定是都是型別,或者介面卡,也可以是一個數。 //一般都使用int,用作規定大小 template <class T,size_t MAXSIZE> 具體使用: template