必须扩展 C3520 参数包 - 'variadic using' 的不正确行为
C3520 parameter pack must be expanded - incorrect behaviour for 'variadic using'
在使用 Microsoft Visual C++ 编译器 15.9.28307.1300 (amd64) 和 c++17 标准使用 Qt 5.12 编译以下代码时,出现以下错误:
error C3520: 'Args': parameter pack must be expanded in this context
note: see reference to class template instantiation
'Helper<Args...>' being compiled
template<typename T>
struct Base {
void operator()(const T& arg){}
};
template <typename... Args>
class Helper : Base<Args>... {
public:
using Base<Args>::operator()...;
};
这是 msvc 的错误吗?有任何已知的解决方法吗?使用 clang 在 macOS 上编译相同的代码。
作为可变参数 using
(C++17) 的解决方法,您可以使用递归方式:
template <typename... Args>
class Helper;
template <>
class Helper<>
{
};
template <typename T>
class Helper<T> : Base<T>
{
public:
using Base<T>::operator();
};
template <typename T, typename... Ts>
class Helper<T, Ts...> : Base<T>, Helper<Ts...>
{
public:
using Base<T>::operator();
using Helper<Ts...>::operator();
};
在使用 Microsoft Visual C++ 编译器 15.9.28307.1300 (amd64) 和 c++17 标准使用 Qt 5.12 编译以下代码时,出现以下错误:
error C3520: 'Args': parameter pack must be expanded in this context note: see reference to class template instantiation 'Helper<Args...>' being compiled
template<typename T>
struct Base {
void operator()(const T& arg){}
};
template <typename... Args>
class Helper : Base<Args>... {
public:
using Base<Args>::operator()...;
};
这是 msvc 的错误吗?有任何已知的解决方法吗?使用 clang 在 macOS 上编译相同的代码。
作为可变参数 using
(C++17) 的解决方法,您可以使用递归方式:
template <typename... Args>
class Helper;
template <>
class Helper<>
{
};
template <typename T>
class Helper<T> : Base<T>
{
public:
using Base<T>::operator();
};
template <typename T, typename... Ts>
class Helper<T, Ts...> : Base<T>, Helper<Ts...>
{
public:
using Base<T>::operator();
using Helper<Ts...>::operator();
};