2017-09-01 6 views
1

Der folgende Code wird nicht kompiliert, da T nun zu einer Referenz abgeleitet wird (entweder l-Wert oder r-Wert, aber dies ist hier nicht relevant). So kann std::vectorT nicht mehr als Argument nehmen. Kennt jemand eine Möglichkeit, das zu beheben? Vielen Dank!Wie übergebe ich Template-Parameter korrekt?

template<typename T> 
void func(T&& t) 
{ 
    std::vector<T> v; 
} 

Antwort: Verwenden Sie std::decay wie kommentiert.

+2

Bitte geben Sie eine [MCVE] an, die das Problem erzeugt, das Sie haben. –

+4

benutze ['std :: zerfall '] (http://en.cppreference.com/w/cpp/types/decay) – SirGuy

+0

Danke SirGuy! Es funktionierte! – Dave

Antwort

1

Wie Argumente mit abgeleiteten Typen deklariert werden, hängt davon ab, wie Sie das Argument verwenden möchten. In der gezeigten Erklärung erklären Sie das Argument als Forwarding Referenz, die das Template-Argument folgert je nachdem, wie die Funktion aufgerufen wird:

  • , wenn die Funktion mit einem L-Wert vom Typ X das Argument T werden aufgerufen X&
  • , wenn die Funktion mit einem R-Wert vom Typ X das Argument aufgerufen wird, TX

sein das resultierende Argument ist inte NDED zu sein irgendwo weitergeleitet und die meisten wird wahrscheinlich verwendet mit

std::forward<T>(t) 

Wenn Sie lieber Ihr Argument verbrauchen (dh das Argument Grube irgendwo) Sie sind wahrscheinlich abschlagen es von Wert zu nehmen (dh Sie‘ d Verwenden Sie f(T t)) und std::move(t) den Wert in sein endgültiges Ziel. Vielleicht möchten Sie das Argument lesen, aber nicht konsumieren. In diesem Fall sollten Sie es als T const& übergeben.

Angenommen, die Verwendung einer Weiterleitungsreferenz ist beabsichtigt, sollten Sie std::vector mit einem entsprechenden Typ deklarieren, der aus dem abgeleiteten Typ, z.

std::vector<std::decay_t<T>> v; 
Verwandte Themen