使用非类型参数包,使用模板模板参数在Visual Studio中的汇编失败
在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我已经向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