2016-03-09 16 views
7

Perché questo C++ non è valido?Perché non è possibile dichiarare un tipo con contenitore modello e valore contenuto modello?

template <typename Container, typename T> 
bool 
foo (const Container <T> &); 

g ++ mi dà Container is not a template che non è chiaramente che cosa significa veramente.

Cercando template <typename Container> template <typename T> non funziona neanche, neppure const typename Container <T> &

Sembra ragionevole a me che uno vorrebbe definire un'interfaccia che è generico su sia il contenitore e il tipo di contenuto.

Quindi,

  • in termini di standard, perché non è questo permesso?
  • in termini di standard di progettazione, perché questo non dovrebbe essere consentito, potrebbe causare problemi?
  • c'è una soluzione alternativa in C++ 14, oltre a basare l'interfaccia su iteratori?
+0

Perché non puoi semplicemente usare il Container e liberarti della T? –

+1

Perché dovrebbe funzionare? Non puoi passare a 'std :: vector' devi passare un' std :: vector '. Se lo fai, allora stai chiedendo al compilatore di fare 'std :: vector ' che non ha senso. – NathanOliver

+0

Il fatto è che stai dicendo al tuo compilatore che i tuoi 2 parametri generici sono tipi sebbene Container non sia un tipo purché non abbia un proprio parametro generico. – Loomchild

risposta

7

Si può fare questo:

template <template <class... > class Container, class T> 
bool foo (const Container<T> &); 

Questa sintassi (class...) dice al compilatore che container è un modello con un numero qualsiasi di argomenti.

Ricorda che quando hai template <class T> vuoi che T sia il tipo. std::vector non è un tipo, è un modello. std::vector<int> è un tipo, ma non è un modello, quindi non è possibile avere std::vector<int> <char>.

+2

Si potrebbe usare 'template contenitore di classe', che funzionerebbe con' std :: vector'. – TartanLlama

+0

@TartanLlama, sì, certamente. Modificato. – SergeyA

Problemi correlati