這幾天本來想將lua_tinker移植到linux上去的,但是由於vc中的模板寫法與gcc中的模板寫法有些不同之處,比如下面一段**:
struct pop_
template<>
static char* invoke(lua_state *l, int index)
template<>
static const char* invoke(lua_state *l, int index)
};
在vs2003中就沒有問題,但是在linux中用g++編譯就會出現問題,g++不支援這種寫法。因為lua_tinker全是模板,而且有很多這種模板與全特化同在乙個類或者結構中的模板,而至今(到筆者寫稿時為止)也沒有找到一種解決方案可以將上面所示**正確移植到linux,所以lua_tinker向linux的移植到現在為止還並沒有成功!雖然,這次移植並沒有成功,但是我還是在這次移植中得到了許多關於模板的寫法的經驗。下面就介紹一下類模板中的函式模板在類內定義與類外定義的兩種寫法:
第一種:類內定義
// 類內定義寫法
templateclass ca
};
第二種:類外定義
// 類外定義的寫法
templateclass ca
;templatetemplateret ca::f()
以上兩中寫法在vc中和g++中都可以順利地編譯!關於文章開頭的第一段**,如何寫才能在g++中順利編譯呢?由於g++不支援類模板中函式模板全特化的template<>寫法,但支援template,template等等的全特化寫法,所以將文章第一段**寫為如下形式即可在g++中編譯通過:
struct pop_
templatestatic char* invoke(lua_state *l, int index)
templatestatic const char* invoke(lua_state *l, int index)
};
但是,由於g++不支援將void,float,double三種型別作為模板引數,所以template,template,template在g++中編譯會出錯!
C 模板函式,模板類
模板如字面的意思為模具模板,並不是乙個正真的物體。例如,在編寫比較兩個數大小的 中,我們可能要比較兩個整數的大小,也能需要比較浮點數等等大小。在這些 中,基本的邏輯都是相同的,只是比較數的型別不同。此時我們就可以用模板這個概念來完成對於不同型別的引數而相同的邏輯的操作。而模板會根據實際的引數型別推演...
成員函式模板
1 背景 參考資料 1 p218的條款45 運用成員函式模板接受所有相容型別,提出了如何使得自定義的智慧型指標支援隱式型別轉換的方法,其中用到的技巧就是使用成員函式模板。關於其詳細的原理,書中已經說的很清楚,只是在程式設計的過程中會遇到挫折,故在此記錄一下成功通過的編譯的 見下一章 2 templa...
成員函式模板
真實指標支援隱式轉換 1 derived class指標可以隱式轉換為base class指標 2 指向non const物件 的指標可以轉換成 指向const物件 的指標。智慧型指標 必須編寫乙個成員函式模板。因為我們無法寫出所有的智慧型指標的建構函式,一旦derived體系有新的補充就又要根據其...