2010-08-22 73 views
4

使用GCC 4.2。 我有這個metatemplate有條件類型:C++模板類問題中的類型條件

template <bool condition, typename Then, typename Else> 
struct IF 
{ 
    typedef Then RET; 
}; 

template <class Then, class Else> 
struct IF<false, Then, Else> 
{ 
    typedef Else RET; 
}; 

,當我使用它是這樣的:

template <typename T> 
class Param 
{ 
    IF< sizeof(int)<sizeof(long), long, int>::RET i; 
}; 

它的工作原理,但是當我這樣使用它(嘗試使用模板參數):

template <typename T> 
class Param 
{ 
    IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam; 
}; 

我收到此錯誤代碼:

error: type 'IF<false, T&, T*>' is not derived from type 'Param<T>' 

爲什麼會發生?如何解決它? 在此先感謝!

+1

http://www.boost.org/doc/libs/1_42_0/libs/mpl/doc/refmanual/if-c.html – 2010-08-22 16:55:10

回答

8

在第二種情況下,RET是什麼,取決於模板類型T。編譯器需要確保它將成爲所有可能實例化中的一個類型(而不是IF的某個實例化的靜態成員)。您可以使用typename關鍵字。

template <typename T> 
class Param 
{ 
    typename IF< sizeof(int)<sizeof(long), T&, T* >::RET mParam; 

}; 
+0

嗯,我們不能把使用鏘爲自動回答這些' typename'問題? :) – 2010-08-22 16:41:01