Variadic template: error: parameter packs not expanded with '...'
Variadic template: error: parameter packs not expanded with '...'
我试图传递多个字符串来填充容器,但我收到此错误。使用 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
如何解决?
args
是参数包,不是参数。这就是为什么你不能使用:
DataContainer.emplace(new QueueDataPtr(args));
改为使用
DataContainer.emplace(new QueueDataPtr(args...));
扩展参数包。
完美转发,对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)...));
}
我试图传递多个字符串来填充容器,但我收到此错误。使用 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
如何解决?
args
是参数包,不是参数。这就是为什么你不能使用:
DataContainer.emplace(new QueueDataPtr(args));
改为使用
DataContainer.emplace(new QueueDataPtr(args...));
扩展参数包。
完美转发,对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)...));
}