首页 > 解决方案 > 类数据成员指针的非类型模板参数包不能用 gcc 编译

问题描述

我尝试用c++17auto 非类型模板参数包为类数据成员指针编写代码,但是下面的代码clang会编译而gcc不会,你可以看到godbolt的错误信息,有人可以告诉我应该哪个我相信,因为我不明白为什么 gcc 拒绝这个。

谢谢你的帮助。

template <
    typename B,
    template <auto B::*...> typename Wrapper, 
    auto B::*... Args
>
void f(Wrapper<Args...>) {}

template <auto... Args> struct Wrapper {};
struct A { int i; float f; };

// gcc error: unable to deduce 'auto B::*' from '&A::i'
f(Wrapper<&A::i, &A::f>{});

我知道如果更改<auto B::*...><auto...>then 两者都可以编译,但我想知道为什么gcc 无法推断出正确的类型,因为以下非自动模板参数得到相同的情况:gcc 无法编译和 clang 可以:

template <
    typename B,
    typename... MT,
    template <MT B::*...> class Wrapper, 
    MT B::*... Args
>
void f(Wrapper<Args...>) {}

标签: c++c++17variadic-templatesautotemplate-argument-deduction

解决方案


尝试

template <
    template <auto ...> typename Wrapper, 
    auto ... Args
>
void f(Wrapper<Args...>) {}

autoB::*是;的替代品 所以你应该使用auto or B::*,而不是两者。


推荐阅读