加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在模板参数的方法中添加类型转换时出现clang错误

发布时间:2020-12-16 07:08:28 所属栏目:百科 来源:网络整理
导读:我有一个模板结构,它将方法的类型和方法的指针作为参数,并将其包装在类似C的函数中: template typename T,T struct proxy;template typename T,typename R,typename ...Args,R (T::* mf)(Args...)struct proxyR (T::*)(Args...),mf{ static R call(T obj,Ar
我有一个模板结构,它将方法的类型和方法的指针作为参数,并将其包装在类似C的函数中:

template <typename T,T> struct proxy;

template <typename T,typename R,typename ...Args,R (T::* mf)(Args...)>
struct proxy<R (T::*)(Args...),mf>
{
    static R call(T& obj,Args&&... args)
    {
        return (obj.*mf)(std::forward<Args>(args)...);
    }
};

代理结构在预期的简单场景中工作,例如:

struct Foo
{
    int foo(int x)
    {
        return x + 1;
    }
};

...
Foo f;
proxy<int(Foo::*)(int),&Foo::foo>::call(f,10);

问题是当我在宏内部使用代理时可以展开:

proxy<decltype((int(Foo::*)(int))(&Foo::foo)),(int(Foo::*)(int))(&Foo::foo)>::call(f,10);

在clang中,错误是:

error: non-type template argument is not a pointer to member constant
proxy<decltype((int(Foo::*)(int))(&Foo::foo)),10);
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

另一方面,GCC 4.8没有报告任何错误,一切都按预期工作.

我的问题是:

>有没有办法解决clang的错误和
>这是我应该报告的clang中的错误吗?

解决方法

您的宏生成标准不符合规范的代码.特别是,在非类型方法指针模板参数中不允许使用强制类型转换.在这种情况下,它也是多余的.

因此,解决此问题的最简单方法是更改??宏:

#define WORKING_LUA_METHOD_FLAGS(name_,methodType_,methodPtr_,flags_) 
  ANKI_LUA_FUNCTION_AS_METHOD_FLAGS(name_,
  (&proxy<methodType_,methodPtr_>::func),flags_)

并在使用时:

ANKI_LUA_METHOD_FLAGS( "bob",(int(Foo::*)(int))(&Foo::foo),empty_flags )

变为:

WORKING_LUA_METHOD_FLAGS( "bob",int(Foo:::*)(int),&Foo::foo,empty_flags )

现在根据标准是正确的.注意“bob”和empty_flags只是真正存在的占位符.更换名称可能需要也可能不需要.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读