1

コンテナを埋めるために複数の文字列を渡そうとしていますが、このエラーが発生します。 gccを使用する4.9.3Variadicテンプレート:エラー:パラメータパックが '...'で展開されていません

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 

解決方法?

+0

[最小、**コンプリート**、かつ検証例](HTTPを作成してみてください。 /stackoverflow.com/help/mcve)と私たちを見せてください。また、完全なエラー出力(テンプレート付きである可能性があります)をテキストとして質問にコピー&ペーストしてください。 –

答えて

3

argsはパラメータではなく、パラメータです。

代わり
DataContainer.emplace(new QueueDataPtr(args)); 

、パラメータパックを展開し

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

を使用する:あなたが使用することはできません理由です。完璧な転送のために

+0

@ rh0x、私がコミットしたすべての愚かな間違いに対してペニーがあった場合にのみ:) –

+0

@Sahu ^^私はムーブコンストラクタを使用していることをどうすれば保証できますか?私はそれをBomQueueDataに定義する必要がありますか? – rh0x

+1

私はそのための構文は、 'QueueDataPtr(std :: forward(args)...' –

1

は、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)...)); 
} 
関連する問題