2012-12-20 41 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

相关问题