可变模板参数:错误:参数包未使用“...”展开

3

我正在尝试传递多个字符串以填充一个容器,但是我收到了这个错误。使用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

如何解决?

请尝试创建一个最小、完整和可验证的示例,并向我们展示。同时,请将完整的错误输出(即使它包含模板也很长)复制粘贴为文本放入问题描述中。 - Some programmer dude
2个回答

6

args是一个参数包,而不是一个参数。这就是为什么你不能使用:

DataContainer.emplace(new QueueDataPtr(args));

相反,使用

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

这将扩展参数包。


1
@rh0x,如果我为每个愚蠢的错误付出一分钱就好了 :) - R Sahu
@Sahu ^^ 我怎样才能确保我正在使用移动构造函数?我必须在BomQueueData中定义它吗? - rh0x
1
我认为这个语法是 QueueDataPtr(std::forward(args)...) - R Sahu

3

为了实现完美转发,请使用通用引用来作为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)...));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接