2011-09-12 19 views
6

繼承我想部分專門用於非字符數組的一個特點:從enable_if'd基地

template<typename T> 
struct is_container : std::false_type {}; 

template<typename T, unsigned N> 
struct is_container<T[N]> 
: std::enable_if<!std::is_same<T, char>::value, std::true_type>::type {}; 

Visual Studio 2010中給了我一個C2039(type是沒有enable_if元... )。但是,SFINAE不應該只是在這裏底部而不是給出編譯器錯誤?或者SFINAE在這種情況下不適用?

當然我可以只單獨對非炭和炭的專業:

template<typename T> 
struct is_container : std::false_type {}; 

template<typename T, unsigned N> 
struct is_container<T[N]> : std::true_type {}; 

template<unsigned N> 
struct is_container<char[N]> : std::false_type {}; 

但我真的很想知道爲什麼SFINAE不會在這種特殊情況下工作。

+1

嗯,我認爲在'std :: enable_if'前面需要'typename',因爲依賴類型,但我不會把它作爲答案,因爲這只是猜測! – AraK

+3

@Arak:在這種情況下不需要'typename'。在搜索基類時,編譯器在開始時排除所有非類型。看到這個:http://stackoverflow.com/questions/4347730/use-of-typename-keyword-with-template-function-parameters – Nawaz

+0

@納瓦茲感謝:) – AraK

回答

2

檢查在 http://www.boost.org/doc/libs/1_47_0/libs/utility/enable_if.html

編輯主題「3.1啓用模板類特例」:如果boost.org鏈接死......

3.1啓用模板類特例 類模板特可以啓用或使用enable_if禁用。需要爲啓用器表達式添加一個額外的模板參數。該參數具有默認值void。例如:

template <class T, class Enable = void> 
class A { ... }; 

template <class T> 
class A<T, typename enable_if<is_integral<T> >::type> { ... }; 

template <class T> 
class A<T, typename enable_if<is_float<T> >::type> { ... }; 

實例化與任何整體型相匹配的第一個特,而任何浮點類型匹配的第二個。所有其他類型都與主模板相匹配。該條件可以是任何取決於類的模板參數的編譯時布爾表達式。再次注意,enable_if的第二個參數是不需要的;默認值(void)是正確的值。

+2

請發佈完整的答案,因爲它是,你的是無用的,如果鏈接死... –

+0

我非常懷疑一個鏈接boost.org會死,但無論如何我會發佈一個完整的答案。 –

+2

我也是這樣,雖然他們在過去已經重組了他們的網站:) –