Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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
Templates 为什么可以';如果在专用参数上使用,是否启用_?_Templates_C++11 - Fatal编程技术网

Templates 为什么可以';如果在专用参数上使用,是否启用_?

Templates 为什么可以';如果在专用参数上使用,是否启用_?,templates,c++11,Templates,C++11,我正在尝试为整型创建一个局部专门化。我的想法是做一些类似的事情: #include <type_traits> template <typename T> struct Class { }; template <typename T> struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> { }; #包括 模板 结构类{ }

我正在尝试为整型创建一个局部专门化。我的想法是做一些类似的事情:

#include <type_traits>

template <typename T>
struct Class {
};

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};
#包括
模板
结构类{
};
模板
结构类{
};
但是,这会导致以下错误:

error: template parameters not deducible in partial specialization:
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
       ^
note: 'T'
错误:部分专门化中无法推断模板参数:
结构类{
^
注:“T”
如果我使用了一个额外的模板参数,它就可以工作了:

#include <type_traits>

template <typename T, typename Enable = void>
struct Class {
};

template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};
#包括
模板
结构类{
};
模板
结构类{
};

为什么我需要额外的模板参数?

在第一种情况下,您没有专门化该类。 当你写作时:

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};

但是专门化不是也解决了类的问题吗?我不明白编译器是如何理解第二种情况的。你实际上不需要
Enable=void
,省去它,它也应该可以正常工作。
template
应该做这个特技!现在我明白了!基本情况是类。专门化是类,所以模板参数现在E是专门化的。如果没有E,编译器会认为没有部分专门化(专门化的类型与基本情况相同)。感谢您对这一点的关注!
template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};
template <>
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> {
};