0

您好我已經得到了我想要的那些模板即子組類中定義的模板類的靜態成員:模板專業化的模板化參數?

template <typename T> 
class FooT 
{ 
private: 
static int ms_id; 
}; 

template <typename T> 
class Foo {}; 

template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10; 

可悲的是,這將引發以下錯誤下GCC 4.1.1

d:\ X \ foo.h中(98):錯誤:模板參數1無效

就行了:template<> template<typename T> int FooT< template Foo<T> >::ms_id = 10;

我在做什麼錯被允許在首位的一般概念?

回答

3

您可以通過部分專業的 「初始模板」 做到這一點:

template <typename T> 
class FooT 
{ 
private: 
static int ms_id; 
}; 

template <typename T> 
class Foo {}; 

template <typename T> 
class GetValue { 
    static const int v = 0; 
}; 

template <typename T> 
class GetValue< Foo<T> > { 
    static const int v = 10; 
}; 

template<typename T> int FooT<T>::ms_id = GetValue<T>::v; 
2

當然,您無法將模板類作爲模板實例的標記。你需要放置一個「具體」類。

例如,與詮釋:

template <> 
int FooT< template Foo<int> >::ms_id = 10; 

template<> 
int FooT<MyClass>::ms_id = 10; 
+0

是的,這工作但我必須爲每個類型o複製此代碼f Foo。這將是很多代碼,編譯器可以通過模板自動執行... – user176168 2009-10-16 11:34:29

1
template <typename T> class Foo{}; 

struct MS_ID_TEN 
{ 
protected: 
    static int ms_id; 
} 
int MS_ID_TEN::ms_id = 10; 

template <typename T> struct MS_ID {} 
template <typename T> struct MS_ID< Foo<T> > : MS_ID_TEN {}; 

template <typename T> 
class FooT : public MS_ID<T> 
{ 
};