使用中的模板参数包
template parameter pack in using
当参数包是基础 class 的模板参数时,如何在多重继承中使用 "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;
}
但是如果我使用模板而不是 A
和 B
- 我会遇到编译错误
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...
因为它是 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;
};
当参数包是基础 class 的模板参数时,如何在多重继承中使用 "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;
}
但是如果我使用模板而不是 A
和 B
- 我会遇到编译错误
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...
因为它是 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;
};