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

2024-06-27

我有一个模板结构体,它将方法的类型和指向方法的指针作为参数,并将其包装在类似 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)...);
    }
};

The proxystruct 按预期在简单场景中工作,例如:

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

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

问题是当我使用proxy内部宏可能会展开为:

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

in clang错误是:

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

另一方面,GCC 4.8 没有报告任何错误,一切都按预期进行。

我的问题是:

  1. 有没有办法解决 clang 的错误
  2. 这是我应该报告的 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 )

becomes:

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

现在根据标准它是正确的。笔记"bob" and empty_flags只是真正存在的内容的占位符。可能需要也可能不需要更换名称。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在模板参数的方法中添加类型转换时出现 clang 错误 的相关文章

  • 使用“对‘boost::system::get_system_category()’的未定义引用”链接到 boost barfs

    我在静态链接使用 boost 1 35 库的应用程序时遇到问题 我使用的是 Linux debian Lenny box 带有 G 4 3 2 链接无 static工作顺利 具体来说 g Wall Wextra pedantic ggdb3
  • 在 C 中使用模板函数的最短示例?

    我如何处理函数echo tpl可以采取1类型参数int or string 然后打印出来 C没有模板 我认为你能做的最好的事情就是使用联合或让函数具有不同的名称 后一种具有不同名称的方法是准标准方法 例如fabs fabsf fabsl a
  • 错误:调用 Configuration.BuildSessionFactory() 时“无法同时获取多个包”;

    升级到 NHibernate 2 1 后 我们收到此错误 QueryException Cannot simultaneously fetch multiple bags NHibernate Loader BasicLoader Post
  • 为什么要在 C 和 C++ 项目中创建 include/ 目录?

    当我处理我的个人 C 和 C 项目时 我通常把file h and file cpp在同一目录中 然后file cpp可以参考file h with a include file h 指示 然而 通常会发现库和其他类型的项目 如 linux
  • 处理可选依赖项 (C#)

    我们有一个可以选择与 TFS 集成的应用程序 但是由于集成是可选的 所以我显然不希望所有机器都需要 TFS 程序集作为要求 我应该怎么办 我是否可以在主程序集中引用 TFS 库 并确保在使用 TFS 集成时仅引用 TFS 相关对象 或者 更
  • StreamReader 的默认值是多少?

    我需要使用这个构造函数public StreamReader Stream stream Encoding encoding bool detectEncodingFromByteOrderMarks int bufferSize bool
  • 如何将值从 ASP.NET MVC 控制器传递到 MVC 视图内的 ASP.NET Webforms 控件?

    我的 ASP NET MVC 方法并未跨越 ASP NET Web 窗体 因此我很难理解如何更好地将值从 ASP NET MVC 控制器传递到 MVC 视图内的 ASP NET Webforms 脚本 例如 控制器动作 public Vie
  • 如何为 IAsyncOperation 指定回调方法

    是否可以指定一个方法完成后调用async手术 平台 C Windows Phone 8 我需要实现非阻塞方法来异步发送UDP数据包 他们有我的方法 onWriteComplete int errorCode 操作完成时回调 这是我尝试过的
  • 使用自定义对象的动态列表并且无法动态更改dataGrid的单元格属性

    我刚开始在 Stack 上发帖 我已经搜索了很长一段时间来解决与我类似的问题 我试图根据对象的布尔值动态地将 WinForms DataGridView 中的复选框从非只读更改为只读 它在调试模式下显示更改已经发生 但是一旦完全运行 应该只
  • NHibernate 继承 - 判别器值

    NHibernate 是否可以有一个像这样工作的判别器 如果值等于 String Empty gt Class1 其他 gt Class2 我已经有一个 CultureName 字符串列 我想将其用作鉴别器 我不想添加额外的布尔列 如果 C
  • WCF:通用接口的序列化可能吗?

    我正在尝试实现一个服务契约 其中包含一个采用通用接口的方法 并且该通用接口本身被赋予一个接口参数 我用 ServiceKnownType 装饰了服务接口 用常规 KnownType 装饰了服务实现 并用常规 KnownType 装饰了数据契
  • 开始学习 C# 的最佳方式是什么?

    我对 vb 6 有一点编程经验 而 vb net 则不多 请告诉我成为专家 C 程序员的最佳方法 我知道这需要很长时间 想想你如何学习人类语言 阅读 写作 口语和听力 阅读代码 阅读文章 阅读示例 当您更有经验时 请查看您使用的一些项目的源
  • 来自“void *”的dynamic_cast

    根据this https stackoverflow com questions 3155277 cannot dynamic cast void to templated class void 没有 RTTI 信息 因此从void 不合法
  • 在 Silverlight 中调用 WCF 服务时使用 Observable.FromEvent

    我正在尝试使用 NET Reactive Framework 来简化对我正在编写的 Silverlight 3 应用程序使用的 WCF 服务的一些异步调用 问题是我很难找到一种有效的方式来构建我的代码 毫无疑问 部分问题是了解 Reacti
  • Microsoft Build Tools 2013 缺少 v120 目录

    我们已经安装了 Microsoft Build Tools 2013 从http www microsoft com en us download details aspx id 40760 http www microsoft com e
  • 如何使用 Dictionary 属性序列化对象?

    在下面的示例代码中 我得到了这个error 元素 TestSerializeDictionary123 Customer CustomProperties 呕吐型 System Collections Generic Dictionary
  • 如何隐藏鼠标光标?

    我想问是否有人可以为我提供一个 C 代码 在其中我可以在按下特定键时隐藏 显示鼠标指针 我发现一些只为 TURBO C 编写的代码 它们都不能使用 dev c 甚至 Visual c 编译和运行 我尝试运行在 Dev C 中找到的代码 但我
  • .NET Compact Framework 上的 DateTime.Now 中的毫秒始终为零?

    我想要一个时间戳对于日志Windows 移动项目 精度必须至少在一百毫秒范围内 然而我打电话给DateTime Now返回一个DateTime对象与Millisecond属性设置为零 还有Ticks属性相应地进行四舍五入 如何获得更好的时间
  • 着色器可以旋转形状以面向相机吗?

    我制作了一个球出现在 3D 空间中的场景 三角球耗费大量资源 所以我使用带有球纹理的二维表面 四边形 来完成此操作 但现在我需要在每次相机移动时调整形状的方向 我使用位置变换和 LookAt 方法来完成此操作 问题是我可以优化这个吗 如果可
  • 在 Angular 6 和 ASP.net 中启用 CORS

    我正在尝试从 Angular 6 应用程序向发送电子邮件的 API 发送 POST 请求 我用邮递员测试了该请求并且它有效 但是当我在 Angular 应用程序中执行 POST 请求时 我的控制台中出现错误 我在 Angular 应用程序中

随机推荐