Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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++ SFINAE专业课程_C++_C++14_Sfinae - Fatal编程技术网

C++ SFINAE专业课程

C++ SFINAE专业课程,c++,c++14,sfinae,C++,C++14,Sfinae,我想编写一个模板类,用SFINAE检查一个特征 正如我在那篇文章中读到的那样,As类不能“重载”: 我编写了以下代码: class AA { public: using TRAIT = int; }; class BB { public: using TRAIT = float; }; template < typename T, typename UNUSED = void> class X; template < typename T> class X<T,

我想编写一个
模板类
,用SFINAE检查一个特征

正如我在那篇文章中读到的那样,As类不能“重载”:

我编写了以下代码:

class AA { public: using TRAIT = int; };
class BB { public: using TRAIT = float; };

template < typename T, typename UNUSED = void> class X;

template < typename T>
class X<T, typename std::enable_if< std::is_same< int, typename T::TRAIT>::value, int >::type>
{
    public:
        X() { std::cout << "First" << std::endl; }
 };

template < typename T>
class X<T, typename std::enable_if< !std::is_same< int, typename T::TRAIT>::value, unsigned int >::type>
{
    public:
        X() { std::cout << "Second" << std::endl; }
};

int main()
{
    X<AA> a;
    X<BB> b;
}
class AA{public:使用TRAIT=int;};
类BB{public:使用TRAIT=float;};
模板class X;
模板
类X::value,int>::type>
{
公众:
X(){std::cout::type>
{
公众:

X(){std::cout专门化必须与主项匹配。确定
X
是什么的查找规则是首先匹配主项并添加默认类型,这使我们找到
X
,然后尝试将其与所有专门化匹配。但是没有一个专门化与
X
匹配,因此最终得到主项ry.主类型不是完整类型,因此出现错误

为什么它们都不匹配?因为你写道:

typename std::enable_if< std::is_same< int, typename T::TRAIT>::value, int >::type
或者说真的:

std::enable_if_t< std::is_same< int, typename T::TRAIT>::value>
std::enable\u如果::value>
类似地,对于
BB
,第二个专门化的第二种类型的计算结果为
unsigned int
,而不是
void
——因此它也不匹配

typename std::enable_if< std::is_same< int, typename T::TRAIT>::value>::type
std::enable_if_t< std::is_same< int, typename T::TRAIT>::value>