可变参数模板:错误:未使用' ...'扩展的参数包

时间:2017-03-03 08:17:10

标签: c++ compiler-errors variadic-templates argument-unpacking

我试图传递多个字符串来填充Container,但是我收到了这个错误。使用gcc 4.9.3

template< class T >
struct DataCompare {
    bool operator()( const T& lhs, const T& rhs ) const
    {
        return operator<( lhs->getCode(), rhs->getCode() );
    }
};

using AggContainer = boost::container::flat_set< T, C >; 
using DataPtr      = boost::shared_ptr< BomQueueData >;
using PropertyQueueDataLess = DataCompare< DataPtr >;
using QueueDataPtrs = AggContainer< DataPtr, DataLess >;

QueueDataPtrs vector_name;

template< class Container, typename ... Args >
static void fillWithData(Container & oDataContainer, Args const & ... args)
{
    typedef typename Container::value_type::element_type QueueDataPtr;
    oDataContainer.emplace(new QueueDataPtr(args));
}

fillWithData(vector_name, x, a, b, c, d); // compiler error

如何解决?

2 个答案:

答案 0 :(得分:3)

args是参数包,而不是参数。这就是你不能使用的原因:

DataContainer.emplace(new QueueDataPtr(args));

相反,请使用

DataContainer.emplace(new QueueDataPtr(args...));

扩展了参数包。

答案 1 :(得分:2)

为了完美转发,请使用args参数的通用引用,然后转发它:

template< class Container, typename ... Args >
static void fillWithData(Container & oDataContainer, 
                         Args&& ... args)  // universal reference
{
    typedef typename Container::value_type::element_type QueueDataPtr;
    oDataContainer.emplace(new QueueDataPtr(std::forward<Args>(args)...));
}