Templates C++;11包扩展参数分配y成员初始化错误编译

Templates C++;11包扩展参数分配y成员初始化错误编译,templates,c++11,template-meta-programming,Templates,C++11,Template Meta Programming,我一直在开发一个通用队列,但是我在包装器方面失败了,包装器将包含队列的不同实现(链表、固定堆栈) 因此,我需要使用可变模板来捕获不同列表内置的不同参数。 下面是一个不是实现的示例代码(未完成): 模板 结构GenericMultiType {}; 模板 结构GenericMultiType { GenericMultiType(const Arg&…aValue):值(aValue)。。。 {} void getValue(Arg&…aValue) { aValue=价值; } Arg…值; 容

我一直在开发一个通用队列,但是我在包装器方面失败了,包装器将包含队列的不同实现(链表、固定堆栈) 因此,我需要使用可变模板来捕获不同列表内置的不同参数。 下面是一个不是实现的示例代码(未完成):

模板
结构GenericMultiType
{};
模板
结构GenericMultiType
{
GenericMultiType(const Arg&…aValue):值(aValue)。。。
{}
void getValue(Arg&…aValue)
{
aValue=价值;
}
Arg…值;
容器容器;
};
int main()
{
}
这是编译器输出错误:

error: expected unqualified-id before '...' token
     Arg ... Value ;
         ^
main.cpp: In constructor 'GenericMultiType<containner<Arg ...>, Arg ...>::GenericMultiType(const Arg& ...)':
main.cpp:105:47: error: class 'GenericMultiType<containner<Arg ...>, Arg ...>' does not have any field named 'Value'
     GenericMultiType(const Arg & ... aValue ):Value(aValue ) ...
                                               ^
错误:在“…”标记之前应为非限定id
Arg。。。价值
^
main.cpp:在构造函数“GenericMultiType::GenericMultiType(const Arg&…)”中:
main.cpp:105:47:错误:类“GenericMultiType”没有任何名为“Value”的字段
GenericMultiType(const Arg&…aValue):值(aValue)。。。
^

Arg…
是包扩展,不构成类型。你要找的是
std::tuple
。因此,您可以将
值设置为适当的元组。以下是修改后的代码:

template<typename containner,typename ... Arg>
struct GenericMultiType
{};
template<template<typename ...> class  containner, typename ... Arg>
struct GenericMultiType<containner<Arg ...>, Arg ... >
{
    using value_type = typename std::tuple<Arg...>;
    GenericMultiType(Arg&& ... aValue ): Value(std::make_tuple(std::forward<Arg>(aValue)...)
    {}
    void getValue(value_type& aValue)
    {
        aValue=Value;
    }
    value_type Value ;
    containner<Arg ...> Containner;
};
模板
结构GenericMultiType
{};
模板
结构GenericMultiType
{
使用value_type=typename std::tuple;
GenericMultiType(Arg&…aValue):值(std::make_tuple(std::forward(aValue)…)
{}
void getValue(值类型和值)
{
aValue=价值;
}
值\类型值;
容器容器;
};

您不能在那里进行包扩展。请使用
std::tuple
代替。thx!这是解决方案。我还收到了这样的评论,即这可以通过对基本模板进行部分专门化来完成。该评论正确吗?提前thx
template<typename containner,typename ... Arg>
struct GenericMultiType
{};
template<template<typename ...> class  containner, typename ... Arg>
struct GenericMultiType<containner<Arg ...>, Arg ... >
{
    using value_type = typename std::tuple<Arg...>;
    GenericMultiType(Arg&& ... aValue ): Value(std::make_tuple(std::forward<Arg>(aValue)...)
    {}
    void getValue(value_type& aValue)
    {
        aValue=Value;
    }
    value_type Value ;
    containner<Arg ...> Containner;
};