2013-12-14 14 views
9

Oto zmiennej liczbie argumentów funkcja szablon że pisałem:Błąd z szablonem variadiac: „parametr paczka musi być rozszerzony”

template<class Container, class Value, class... Args> 
Value& insert(Container& c, Args&&... args) { 
    c.emplace_back(args); 
    return c.back(); 
} 

Gdy używam insert tak dostaję błąd:

list<int> lst; 
int& num = insert<list<int>, int, int>(lst, 4); 

błąd narzeka na tej linii w organizmie insert:

c.emplace_back(args); // <= 'args' : parameter pack must be 
         //    expanded in this context 

Co to znaczy i jak mogę to naprawić?

+5

Zapomniałaś wielokropek: 'c.emplace_back (args ...);'. – Constructor

+2

'Wartość' powinna być również pierwszym argumentem szablonu, tak aby można było odliczyć argumenty za szablon dla pozostałych argumentów (np. 'Insert (lst, 4);') – 0x499602D2

+1

I zapomniałeś przekazać dalej: 'c.emplace_back (std) :: forward (args) ...); ' – dyp

Odpowiedz

16

Błąd wynika z braku elipsy (...) po args podczas przekazywania wszystkich indywidualnych parametrów (zamiast zestawu parametrów) do emplace_back.

Stała (i ulepszany) wersja:

template<class Container, class... Args> 
auto insert(Container& c, Args&&... args) -> decltype (c.back()) { 
    c.emplace_back(std::forward<Args>(args)...); 
    return c.back(); 
} 
Powiązane problemy