【问题标题】:template parameter pack in using模板参数包在使用
【发布时间】:2025-12-20 14:45:10
【问题描述】:

当参数包是基类的模板参数时,如何在多重继承中使用“using”关键字?

下面的代码编译得很好

struct A
{
    void foo(int) {}
};

struct B
{
    void foo(int) {}
};

template<typename ...Types>
struct C : public Types...
{
   using Types::foo...;
};

int main()
{
    C<A,B> c;
}

但是如果我使用模板而不是 AB - 我有编译错误

template<typename T> 
struct TA {};

template<>
struct TA<int>
{ 
    void foo(int) {} 
};

template<>
struct TA<double>
{
    void foo(int) {}
};

template<typename ...Types>
struct TC : public TA<Types>...
{
    using TA<Types>::foo...; // ERROR C3520
};

错误:

error C3520: 'Types': parameter pack must be expanded in this context

如何重写第二段代码以使其工作?

PS 我用 gcc 尝试了这段代码,它编译没有错误。但是现在我正在使用 msvc...

【问题讨论】:

标签: c++ visual-c++ variadic-templates using


【解决方案1】:

由于它是known MSVC bug,如果您仍然想使用 MSVC 进行这项工作,您将不得不(不是很)艰难地完成:

template <typename ...Types>
struct TC;

template <typename T>
struct TC<T> : TA<T>
{
    using TA<T>::foo;
};

template <typename T, typename ...Types>
struct TC<T, Types...> : public TC<T>, public TC<Types...>
{
    using TC<T>::foo;
    using TC<Types...>::foo;
};

【讨论】:

  • 其实在 C++17 之前,事情就是这么干的