2012-12-20 32 views
2

Possible Duplicate:
「What happened to my SFINAE」 redux: conditional template class members?的std :: enable_if串/ char類型

爲什麼我不能傳給其他的參數在我的模板類?我試圖啓用一個特定的參數只有當傳遞的類型是一個文字類型。如果不是,請接受其他類型,但不要啓用區分大小寫參數。

爲什麼下面不能編譯?

#include <iostream> 
#include <type_traits> 

template<typename T> 
struct is_literal 
{ 
    enum{value = false}; 
}; 

template<> 
struct is_literal<char> 
{ 
    enum{value = true}; 
}; 

template<> 
struct is_literal<char*> 
{ 
    enum{value = true}; 
}; 

template<> 
struct is_literal<const char*> 
{ 
    enum{value = true}; 
}; 

template<typename Char, typename Traits, typename Alloc> 
struct is_literal<std::basic_string<Char, Traits, Alloc>> 
{ 
    enum 
    { 
     value = true 
    }; 
}; 

template<typename T> 
class Test 
{ 
    public: 
     bool Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type CaseSensitive = true); 
}; 

template<typename T> 
bool Test<T>::Contains(T DataType, typename std::enable_if<is_literal<T>::value, bool>::type CaseSensitive) 
{ 
    return true; 
} 


int main() 
{ 
    Test<int> F; //This line gives errors.. It gives none if I pass char, char*, const char*, std::string. 
    F.Contains(1); 
} 
+0

你會得到什麼錯誤?請將其粘貼(準確地)並指出它所指的是哪一行。 –

回答

3

SFINAE只能在重載解析期間執行替換時發生。這意味着你需要必須有有一個函數模板。在這種情況下,您在類模板中具有非模板功能。這是行不通的。你可以添加一個默認的模板參數來解決這個問題。

template <typename U = T> 
bool Contains(U DataType, typename std::enable_if<is_literal<U>::value, bool>::type CaseSensitive = true); 
+0

嗯,我無法得到那個工作。我所做的: 模板 模板 布爾測試 ::包含(U數據類型,類型名稱的std :: enable_if ::值,布爾> ::類型區分大小寫) { 迴歸真實; } – Brandon

+0

@CantChooseUsernames:[Works here](http://liveworkspace.org/code/1b6ow5$0)。 – ildjarn

+0

嗯,但然後我得到: | 61 |錯誤:沒有匹配的函數調用'測試 :: Contains(int)' – Brandon

相關問題