這幾天本來(lái)想將Lua_Tinker移植到Linux上去的,但是由于VC中的模板寫(xiě)法與gcc中的模板寫(xiě)法有些不同之處,比如下面一段代碼:
struct pop_
{
template<typename T>
static T invoke(lua_State *L, int index) { return lua2type<T>::invoke(L, index); }
template<>
static char* invoke(lua_State *L, int index) { return (char*)lua_tostring(L, index); }
template<>
static const char* invoke(lua_State *L, int index) { return (const char*)lua_tostring(L, index); }
};
在VS2003中就沒(méi)有問(wèn)題,但是在Linux中用g++編譯就會(huì)出現(xiàn)問(wèn)題,g++不支持這種寫(xiě)法。因?yàn)長(zhǎng)ua_Tinker全是模板,而且有很多這種模板與全特化同在一個(gè)類(lèi)或者結(jié)構(gòu)中的模板,而至今(到筆者寫(xiě)稿時(shí)為止)也沒(méi)有找到一種解決方案可以將上面所示代碼正確移植到Linux,所以Lua_Tinker向Linux的移植到現(xiàn)在為止還并沒(méi)有成功!雖然,這次移植并沒(méi)有成功,但是我還是在這次移植中得到了許多關(guān)于模板的寫(xiě)法的經(jīng)驗(yàn)。下面就介紹一下類(lèi)模板中的函數(shù)模板在類(lèi)內(nèi)定義與類(lèi)外定義的兩種寫(xiě)法:
第一種:類(lèi)內(nèi)定義
// 類(lèi)內(nèi)定義寫(xiě)法
template<typename T>
class CA
{
template<typename RET>
static RET f()
{
RET t;
return t;
}
};
第二種:類(lèi)外定義
// 類(lèi)外定義的寫(xiě)法
template<typename T>
class CA
{
template<typename RET>
static RET f()
{
RET t;
return t;
}
};
template<typename T>
template<typename RET>
RET CA<T>::f()
{
RET t;
return t;
}
以上兩中寫(xiě)法在VC中和g++中都可以順利地編譯!關(guān)于文章開(kāi)頭的第一段代碼,如何寫(xiě)才能在g++中順利編譯呢?由于g++不支持類(lèi)模板中函數(shù)模板全特化的template<>寫(xiě)法,但支持template<int>,template<char*>等等的全特化寫(xiě)法,所以將文章第一段代碼寫(xiě)為如下形式即可在g++中編譯通過(guò):
struct pop_
{
template<typename T>
static T invoke(lua_State *L, int index) { return lua2type<T>::invoke(L, index); }
template<char*>
static char* invoke(lua_State *L, int index) { return (char*)lua_tostring(L, index); }
template<const char*>
static const char* invoke(lua_State *L, int index) { return (const char*)lua_tostring(L, index); }
};
但是,由于g++不支持將void,float,double三種類(lèi)型作為模板參數(shù),所以template<void>,template<float>,template<double>在g++中編譯會(huì)出錯(cuò)!