Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::如果字符串/字符类型为enable__C++_C++11 - Fatal编程技术网

C++ std::如果字符串/字符类型为enable_

C++ std::如果字符串/字符类型为enable_,c++,c++11,C++,C++11,可能重复: 为什么我不能将其他参数传递给我的模板类?仅当传递的类型是文本类型时,我才尝试启用特定参数。如果不是,则接受其他类型,但不启用区分大小写的参数 为什么下面的代码不编译 #include <iostream> #include <type_traits> template<typename T> struct is_literal { enum{value = false}; }; template<> struct is_li

可能重复:

为什么我不能将其他参数传递给我的模板类?仅当传递的类型是文本类型时,我才尝试启用特定参数。如果不是,则接受其他类型,但不启用区分大小写的参数

为什么下面的代码不编译

#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);
}
#包括
#包括
模板
struct是_-literal
{
枚举{value=false};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举{value=true};
};
模板
struct是_-literal
{
枚举
{
值=真
};
};
模板
课堂测试
{
公众:
bool包含(T数据类型,typename std::enable_if::type CaseSensitive=true);
};
模板
bool Test::Contains(T数据类型,typename std::enable_if::type区分大小写)
{
返回true;
}
int main()
{
Test F;//此行给出错误..如果我传递char,char*,const char*,std::string,它将不给出任何错误。
F.包含(1);
}

SFINAE只能在重载解析期间执行替换时发生。这意味着您必须有一个函数模板。在这种情况下,类模板中有一个非模板函数。这是行不通的。您可以添加默认模板参数来解决此问题

template <typename U = T>
bool Contains(U DataType, typename std::enable_if<is_literal<U>::value, bool>::type  CaseSensitive = true);
模板
bool包含(U数据类型,typename std::enable_if::type CaseSensitive=true);

您会遇到什么错误?请(准确地)粘贴它,并指出它指的是哪一行。嗯,我无法让它工作。我做了:模板bool Test::Contains(U数据类型,typename std::enable_if::type区分大小写){return true;}@CantChooseUsernames:.Hmm但我得到:| 61 |错误:调用'Test::Contains(int)'@CantChooseUsernames时没有匹配的函数:您从未对
int
进行过专门化,所以这正是应该发生的。。。