Шаблон Variadic: ошибка: пакеты параметров не расширены с помощью «…»

Я пытаюсь передать несколько строк для заполнения контейнера, но я получаю эту ошибку. Использование 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

Как решить?

1

Решение

args это пакет параметров, а не параметр. Вот почему вы не можете использовать:

DataContainer.emplace(new QueueDataPtr(args));

Вместо этого используйте

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

Это расширяет пакет параметров.

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)...));
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector