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的错误和 解决方法
您的宏生成标准不符合规范的代码.特别是,在非类型方法指针模板参数中不允许使用强制类型转换.在这种情况下,它也是多余的.
因此,解决此问题的最简单方法是更改??宏: #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只是真正存在的占位符.更换名称可能需要也可能不需要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |