Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 元编程中的最后一个递归问题_C++_Templates_C++11_Metaprogramming - Fatal编程技术网

C++ 元编程中的最后一个递归问题

C++ 元编程中的最后一个递归问题,c++,templates,c++11,metaprogramming,C++,Templates,C++11,Metaprogramming,我在一个类中有以下(部分)代码,在这个类中,我试图通过C++11中的元编程根据一系列值来计算一个值 bool eval(GLenum value) { return false; }; template<GLenum One, GLenum... Others> bool eval(GLenum value) { if( value == One ) return true; // Try out the rest return e

我在一个类中有以下(部分)代码,在这个类中,我试图通过C++11中的元编程根据一系列值来计算一个值

bool eval(GLenum value)
{
    return false;
};

template<GLenum One, GLenum... Others>
bool eval(GLenum value)
{
    if( value == One )
        return true;

    // Try out the rest
    return eval<Others...>(value);
};
bool eval(谷值)
{
返回false;
};
模板
布尔值(谷值)
{
如果(值==1)
返回true;
//试试其余的
返回eval(value);
};
gcc投诉:

../emul/GLPart.h:在成员函数“bool”中 GLPart::eval(GLenum)[无符号整数=519u, unsigned int…Others={},unsigned int…ValidEnums={512u,513u, 514u、515u、516u、517u、518u、519u},格伦=无符号整数]: ../emul/GLPart.h:26:31:从“bool”实例化 GLPart::eval(GLenum)[无符号整数=518u, unsigned int…Others={519u},unsigned int…ValidEnums={512u, 513u,514u,515u,516u,517u,518u,519u},格伦=无符号整数]' ../emul/GLPart.h:26:31:从“bool”实例化 GLPart::eval(GLenum)[无符号整数=517u, 无符号整数…其他={518u,519u},无符号整数…有效数= {512u,513u,514u,515u,516u,517u,518u,519u},格伦=无符号 int]'../emul/GLPart.h:26:31:从“bool”实例化 GLPart::eval(GLenum)[无符号整数=516u, 无符号整数…其他={517u,518u,519u},无符号整数 …有效值={512u,513u,514u,515u,516u,517u,518u,519u}, GLenum=unsigned int]'../emul/GLPart.h:26:31:实例化自 'bool GLPart::eval(GLenum)[无符号整数=515u, 无符号整数…其他={516u,517u,518u,519u},无符号整数 …有效值={512u,513u,514u,515u,516u,517u,518u,519u}, GLenum=unsigned int]'../emul/GLPart.h:26:31:实例化自 'bool GLPart::eval(GLenum)[无符号整数=514u, 无符号整数…其他={515u,516u,517u,518u,519u},无符号整数 …有效值={512u,513u,514u,515u,516u,517u,518u,519u}, GLenum=unsigned int]'../emul/GLPart.h:26:31:实例化自 'bool GLPart::eval(GLenum)[无符号整数=513u, 无符号整数…其他={514u、515u、516u、517u、518u、519u}, 无符号整数…有效数={512u,513u,514u,515u,516u,517u, 518u,519u},GLenum=unsigned int]'../emul/GLPart.h:26:31:
从“bool GLPart::eval(GLenum)”实例化 无符号整数一=512u,无符号整数…其他=513u,514u,515u, 516u,517u,518u,519u},无符号整数…有效数={512u,513u, 514u,515u,516u,517u,518u,519u},格伦=无符号整数]' ../emul/GLPart.h:31:43:从“bool”实例化 GLPart::Evaluate(GLenum)[带无符号int…ValidEnums ={512u,513u,514u,515u,516u,517u,518u,519u},格伦=无符号 int]'alpha.cpp:8:7:从此处实例化../emul/GLPart.h:26:31: 错误:调用“GLPart::eval(GLenum&)”时没有匹配的函数

因此,当一个有值而另一个没有值时,它似乎被最后一次递归阻塞了。在这种情况下,模板参数应该为空。我需要以另一种方式申报普通评估吗?在一段时间内还没有编码C++,所以它可能是微不足道的,但我就是不明白它。p> 尝试将模板添加到第一个评估时,它会阻塞:

../emul/GLPart.h:14:11:错误:中的显式专门化 非命名空间作用域“类GLPart”../emul/GLPart.h:21:7: 错误:模板参数列表太多../emul/GLPart.h:在成员中 函数“bool GLPart::Evaluate(GLenum)”: ../emul/GLPart.h:32:23:错误:参数包未展开为 “…”:../emul/GLPart.h:32:23:注意:'ValidEnums' ../emul/GLPart.h:32:33:错误:应为“,”或“;”在“…”标记之前

解决方案:

template<GLenum One>
bool eval(GLenum value)
{
    return value == One;
};

template<GLenum One, GLenum Two, GLenum... Others>
bool eval(GLenum value)
{
    if( eval<One>(value) )
        return true;

    // Try out the rest
    return eval<Two, Others...>(value);
};
模板
布尔值(谷值)
{
返回值==一;
};
模板
布尔值(谷值)
{
如果(评估(价值))
返回true;
//试试其余的
返回eval(value);
};

正如Bo Persson所说,第一个版本不是模板,因此调用eval永远不会调用第一个版本。你想要:

template<>  //this tells compiler that eval is a template function
bool eval(GLenum value)
{
    return false;
};
template<GLenum One, GLenum... Others>
bool eval(GLenum value)
{
    if( value == One )
        return true;

    // Try out the rest
    return eval<Others...>(value);
};
template//这告诉编译器eval是一个模板函数
布尔值(谷值)
{
返回false;
};
模板
布尔值(谷值)
{
如果(值==1)
返回true;
//试试其余的
返回eval(value);
};

正如Bo Persson所说,第一个版本不是模板,因此调用eval永远不会调用第一个版本。你想要:

template<>  //this tells compiler that eval is a template function
bool eval(GLenum value)
{
    return false;
};
template<GLenum One, GLenum... Others>
bool eval(GLenum value)
{
    if( value == One )
        return true;

    // Try out the rest
    return eval<Others...>(value);
};
template//这告诉编译器eval是一个模板函数
布尔值(谷值)
{
返回false;
};
模板
布尔值(谷值)
{
如果(值==1)
返回true;
//试试其余的
返回eval(value);
};

由于这往往会产生大量歧义错误,因此似乎可以明确工作的变化如下所示:

template<GLenum One> 
bool eval(GLenum value)
{
    return value == One;
};
template<GLenum One, GLenum Two, GLenum... Others>
bool eval(GLenum value)
{
    if( value == One )
        return true;

    // Try out the rest
    return eval<Two, Others...>(value);
};
模板
布尔值(谷值)
{
返回值==一;
};
模板
布尔值(谷值)
{
如果(值==1)
返回true;
//试试其余的
返回eval(value);
};

第一个重载只接受一个参数,第二个重载至少接受两个参数。不管怎样,接受零参数可能没有意义。

由于这会产生大量的歧义错误,因此似乎可以明确工作的变化如下所示:

template<GLenum One> 
bool eval(GLenum value)
{
    return value == One;
};
template<GLenum One, GLenum Two, GLenum... Others>
bool eval(GLenum value)
{
    if( value == One )
        return true;

    // Try out the rest
    return eval<Two, Others...>(value);
};
模板
布尔值(谷值)
{
返回值==一;
};
模板
布尔值(谷值)
{
如果(值==1)
返回true;
//试试其余的
返回eval(value);
};

第一个重载只接受一个参数,第二个重载至少接受两个参数。采用零参数可能没有任何意义。

第一个函数的可能重复项不是模板,因此不能像这样调用它
eval(value)。尝试并确实创建了另一个错误…第一个函数的可能副本不是模板,因此不能像这样调用它
eval(value)。尝试并确实创建了另一个错误…我认为您也不能这样做。这个