首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在使用enable_if时解决此错误:“在‘struct std::enable_if<false,void>’中没有名为‘type’的类型”

如何在使用enable_if时解决此错误:“在‘struct std::enable_if<false,void>’中没有名为‘type’的类型”
EN

Stack Overflow用户
提问于 2020-12-15 10:45:02
回答 1查看 1K关注 0票数 0

我想用不同类型的T调用pushArg()方法。

下面是相关的代码片段:

代码语言:javascript
运行
复制
//test.hpp
struct Demo {int a};

typedef int (*CALL_CFunction)(struct Demo* );

classs Ctx
{
    /*push bool */
    template <typename T, 
              typename std::enable_if<std::is_integral<T>::value>::type* = nullptr,
              typename std::enable_if<std::is_same<T, bool>::value>::type* = nullptr>
    int pushArg(T& val)
    {
        std::std << "push bool" <<std::endl;  
        return 0;
    }

    /*push lua_CFunction*/
    template <typename T, 
          typename std::enable_if<std::is_pointer<T>::value>::type* = nullptr,
          typename std::enable_if<std::is_same<CALL_CFunction, T>::value>::type* = nullptr>
    int pushArg(T& val)
    {
        std::cout << "push function" << std::endl;
        return 0;
    }
}

调用pushArg()的函数

代码语言:javascript
运行
复制
int foo(Struct Demo *) {return 0;}
Ctx ctx;
ctx.pushArg(foo);

以下是错误消息:

代码语言:javascript
运行
复制
  test.cpp:36:22: error: no matching function for call to ‘ctx::pushArg(int (&)(lua_State*))’
      pCtx->pushArg(foo);
                          ^
    In file included from test.cpp:1:0:
    test.hpp:131:9: note: candidate: template<class T, typename std::enable_if<std::is_integral<_Tp>::value>::type* <anonymous>, typename std::enable_if<std::is_same<T, bool>::value>::type* <anonymous> > int ctx::pushLuaArg(T&)
         int pushLuaArg(T& val)
             ^
    test.hpp:131:9: note:   template argument deduction/substitution failed:
    test.hpp:129:76: error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
               typename std::enable_if<std::is_integral<T>::value>::type* = nullptr,
                                                                            ^
EN

回答 1

Stack Overflow用户

发布于 2020-12-15 10:57:07

pushArg的参数val被声明为按引用传递,然后给定ctx.pushArg(foo);,函数到指针的衰减不会发生,而T被推导为函数类型,即int (Demo*)。对于第二个过载,std::is_pointer<T>::valuestd::is_same<CALL_CFunction, T>::value都会产生false

对于std::is_pointer,您可以使用std::is_function,但它似乎是多余的。仅仅是std::is_same就足够了。(如果std::is_same<CALL_CFunction, T*>::value提供true,那么std::is_function<T>::value也将是true。)例如。

代码语言:javascript
运行
复制
template <typename T, 
          typename std::enable_if<std::is_same<CALL_CFunction, T*>::value>::type* = nullptr>
//                                                              ^
int pushArg(T& val)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65299314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档