使用非类型参数包,使用模板模板参数在Visual Studio中的汇编失败

发布于 2025-01-21 12:11:25 字数 1490 浏览 0 评论 0原文

在Visual Studio中,我会使用以下代码遇到此编译器错误,我认为应该将其编译为罚款(GCC 11.2和Clang 14.0对其进行了编译)。非型参数套件(自动...)意味着我应该能够传递具有任何数量的非类型模板参数的模板,但是汇编仅在传递使用单个非类型模板的模板中才能成功范围。

我缺少的东西会在Visual Studio中完成这项工作吗?

我在Visual Studio 2019上使用的“/std:C ++最新”,版本16.11.12

错误C3201:类模板的模板参数列表'testValues'testValues :: Twoparams'与模板参数列表不匹配模板参数'x :

  namespace testValues {
    template<template<auto...> class X>
    struct templatetemplateparam {};

    template<int i>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<int i, int j>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

如果相关,则具有特定非类型参数或类型参数包的等效代码确实会编译

  namespace testIntValues {
    template<template<int...> class X>
    struct templatetemplateparam {};

    template<int i>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<int i, int j>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

  namespace testTypes {
    template<template<typename...> class X>
    struct templatetemplateparam {};

    template<typename>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<typename, typename>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

In Visual Studio I get this compiler error with the below code which I think should compile fine (gcc 11.2 and clang 14.0 compile it). The non-type parameter pack (auto...) means I should be able to pass in a template with any number of non-type template parameters, but the compilation only succeeds when passing in a template that uses a single non-type template parameter.

Is there something I'm missing that will make this work in Visual Studio?

I'm using "/std:c++latest" on Visual Studio 2019, version 16.11.12

error C3201: the template parameter list for class template 'testValues::twoParams' does not match the template parameter list for template parameter 'X'

  namespace testValues {
    template<template<auto...> class X>
    struct templatetemplateparam {};

    template<int i>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<int i, int j>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

The equivalent code with a specific non-type parameter or a type parameter pack does compile, if that's relevant:

  namespace testIntValues {
    template<template<int...> class X>
    struct templatetemplateparam {};

    template<int i>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<int i, int j>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

  namespace testTypes {
    template<template<typename...> class X>
    struct templatetemplateparam {};

    template<typename>
    struct oneParam {};
    using oneParam_t = templatetemplateparam<oneParam>;

    template<typename, typename>
    struct twoParams {};
    using twoParams_t = templatetemplateparam<twoParams>;
  }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

橙味迷妹 2025-01-28 12:11:25

我已经向MS报告了这一点,对我来说看起来像是一个错误: https://develovelcercommunity.visualstudio.com/t/compilation-error-c3021-when-when-using-using-value/10015492

I've reported this to MS at it looks like a bug in Visual Studio to me: https://developercommunity.visualstudio.com/t/Compilation-error-C3021-when-using-value/10015492

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文