当前位置: 首页 > 知识库问答 >
问题:

函数类型不是模板非类型参数的有效类型?

郎雅昶
2023-03-14

OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于无符号glCreateProgram()uluglDeleteProgram(无符号程序)。但是,也有一些函数对适用于资源数组,例如uluglGenBuffers(size_tn,无符号*缓冲区)uluglDeleteBuffers(size_tn,const无符号*缓冲区);。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是...

template <typename T_res,
          typename T_release_func,
          T_release_func func>
struct GL_resource
{
    GL_resource(T_res name_) : name{name_}
    {
    }

    ~GL_resource()
    {
        func(name);
    }

private:
    T_res name;
};

template <typename T_res, typename FT, FT func, typename RT, typename DT>
struct GL_resource<T_res, RT (size_t, DT*), func>
{
    ~GL_resource()
    {
        func(1, name);
    }
};   

对于上述SSCCE g树皮:

错误:“RT(无符号 int, DT*)”不是模板非类型参数结构的有效类型GL_resource

然后我写了一个虚拟函数void release(size_t,int*){},并将物种化重写为

template <typename T_res, typename FT, FT func>
struct GL_resource<T_res, decltype(release), release>
{
    ~GL_resource()
    {
        func(1, name);
    }
};

这次我得到了:

错误:“ulu(无符号int, int*)”不是模板非类型参数结构GL_resource的有效类型。

有人能解释一下原因吗?

共有1个答案

吕永寿
2023-03-14

函数不是值,因此它们不能是非类型模板参数;但是指向函数的指针可以是:

template <typename T_res, typename RT, typename DT, RT (*func) (size_t, DT*)>
struct GL_resource<T_res, RT (*)(size_t, DT*), func>
{
    ~GL_resource()
    {
        func(1, name);
    }
};   

请注意,即使用作非类型模板参数,函数也会受到指针衰减的影响,因此FT将始终是指向函数的指针类型,而不是函数类型。

 类似资料:
  • 我在一个项目中,必须使用一个常量模板对象的引用作为另一个对象模板的参数。 简单地说,我想这样做: 问题是我不知道如何让它发生,我需要你的帮助。 在visual studio上,上述代码将产生以下错误:“C2971:具有非静态存储持续时间的变量不能用作非类型参数” 如果我尝试使用 ,则进行以下更改: 我得到以下错误“C2131:表达式未计算为常数” 好吧,我确实尝试了一些我在其他帖子上看到的关于类似

  • 也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为指定模板参数: 将替换为,或没有帮助。那么这种专门化是否可能呢?

  • 考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。

  • 上节的 Sstack 类模扳只用模板首部的类型参数,也可以使用无类型参数(non-type parameter),无类型参数可以有默认参数,一般将无类型参数当作Const处理。例如,模板首都可以取 int elements 参数,如下所示: template<class T,int elements> // note non-type parameter 然后下列声明: Stack<double,

  • 我对编程和C++相当陌生。我有一个函数,我想接受以模板化值作为参数的函数指针。我的意思是... 我有这个功能: 我试过的: 结果: .h:165:22:注意:已忽略候选模板:无法将“function ,allocator >&)”与“void(*)(bool,std::vectorstd::vectorstd::allocatorstd::tuple &)”void postgrescaller:

  • 使用以下代码生成时 生成以下诊断(代码后): 诊断: 有趣的部分不是关于歧义错误本身(这不是这里主要关注的问题)。有趣的是,当仅使用函数名调用fun时,第一个fun的模板参数F被解析为纯函数类型double(double),而第二个fun的模板参数F被解析为更期望的函数指针类型。 然而,当我们将调用<代码>乐趣(测试) 更改为<代码>乐趣( 这种行为似乎是所有Clang和GCC(以及Visual