1

Ich versuche, mehrere Zeichenfolgen übergeben, um einen Container zu füllen, aber ich erhalte diesen Fehler. Mit gcc 4.9.3Variadic Vorlage: Fehler: Parameter Packs nicht erweitert mit '...'

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 

Wie zu lösen?

+0

Bitte versuchen Sie ein [Minimal, ** ** Vollständige und prüfbare Beispiel] (http zu erstellen://stackoverflow.com/help/mcve) und zeig uns. Und bitte kopieren Sie auch die vollständige Fehlerausgabe (so lange es bei Vorlagen sein mag) als Text in die Frage. –

Antwort

3

args ist ein Parameterpaket, kein Parameter. Aus diesem Grund können Sie nicht verwenden:

DataContainer.emplace(new QueueDataPtr(args)); 

Verwenden Sie stattdessen

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

, dass der Parameter Pack erweitert.

+0

@ rh0x, nur wenn ich einen Pfennig für jeden dummen Fehler hatte, den ich begangen habe :) –

+0

@Sahu ^^ wie kann ich garantieren, dass ich den Move Constructor benutze? Ich muss es in BomQueueData definieren? – rh0x

+1

Ich denke, die Syntax dafür ist 'QueueDataPtr (std :: forward (args) ...)' –

1

Für perfektes Forwarding, verwenden Sie eine universelle Referenz für die args Parameter und leiten sie dann:

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