Modello argomenti di default

Se mi è consentito fare le seguenti cose:

template <typename T = int>
class Foo{
};

Perché non mi è concesso fare le seguenti principali?

Foo me;

Ma devo specificare i seguenti:

Foo<int> me;

C++11 introdotto il modello predefinito argomenti e per ora sono in fase di inafferrabile per tutta la mia comprensione.

InformationsquelleAutor user633658 | 2013-03-12

 

4 Replies
  1. 151

    Devi fare:

    Foo<> me;

    Il modello argomenti devono essere presenti, ma non si possono lasciare vuoti.

    Pensare ad esso come una funzione foo con un unico argomento di default. L’espressione foo non chiamare, ma foo() volontà. La sintassi dell’argomento deve essere ancora lì. Questo è coerente con quella.

    • Mi sono sempre chiesto perché il <> era necessario. Qualche idea?
    • Suppongo che si verrebbe a creare alcune complicazioni inutili se Foo potrebbe essere un modello identificatore o potrebbe essere una esplicita istanza, a seconda se c’è un argomento di default. Meglio tenere l’esplicita istanza di sintassi. Pensate a come una funzione foo con un unico parametro di default. Non si possono chiamare come foo, è chiamata con foo(). Ha senso mantenere questa coerenza.
    • D’altra parte, foo<>() può essere abbreviato foo()
    • ma non è possibile chiamare una funzione senza argomenti come foo sia; è possibile assegnare un nome di una classe di argomenti, come Foo tuttavia.
    • Sto solo cercando di indovinare che stavano cercando di essere coerente, non che lo siano in realtà. 😀
    • Ma una classe, questo è un modello. Se si crea un’istanza di un modello, è necessario dare il modello di argomenti (eccetto la situazione notato da @aschepler). Lo so, non la migliore di argomenti.
    • Con una funzione, il modello di argomenti può essere dedotta con gli argomenti della funzione. Con una classe, non è possibile decidere se si intende un modello di classe con argomenti di default o non classe modello.
    • Buona risposta.
    • ma non si può avere un modello di classe e di un non-modello di classe con lo stesso nome, in modo che il compilatore dovrebbe essere in grado di decidere da solo guardando qual è il nome.
    • Ohi, hai ragione, ho perso.
    • Il comitato standard chiesti lo stesso, immagino. Ora, con il C++17, il <> non è più necessario in questo caso. Check out la mia risposta per ulteriori dettagli.
    • Puzza che non riesco a convertire il codice che utilizza una Matrice di classe con i carri allegorici, e successivamente si decide di cambiare a Matrice<typename T=float> quindi, double può essere utilizzata anche w/o rottura del vecchio codice. Std comitato hanno sbagliato.

  2. 31

    Con C++17, si può infatti.

    Questa caratteristica è chiamata classe modello argomento detrazione e aggiungere una maggiore flessibilità per il modo in cui è possibile dichiarare variabili di basati su modelli, tipi.

    Così,

    template <typename T = int>
    class Foo{};
    
    int main() {
        Foo f;
    }

    è ora legale codice C++ .

    • Strano. Appena provato nel mio C++17 progetto e non ha funzionato: “modello tipo di segnaposto ‘const MyType’ deve essere seguita da una semplice dichiarazione-id”. Sto usando GCC 7.3.0.
    • È difficile dire senza vedere il tuo codice e la riga di comando… Forse ti rapporti con i puntatori come qui?
  3. 18

    È possibile utilizzare le seguenti:

    Foo<> me;

    E hanno int essere il modello argomento. Le parentesi quadre sono necessari e non può essere omesso.

    • Senso e grazie, ma, come indicato di seguito, perché il tipo di specifica sono ot essere presente?
    • Volevi dire “identificatore di tipo”? Io non sono sicuro di aver capito
    • Comunque, riguardo il motivo dietro la necessità di vuoto staffe angolari, posso solo fare delle congetture, e sono tutti circa l’esclusione di possibili ambiguità con l’utilizzo del modello nome da solo, ma devo confessare che non so il motivo esatto
    • Ho il forte sospetto che il requisito per il <> è quello di consentire al compilatore del parser per determinare che si fa riferimento a una classe basata su modelli chiamato pippo, piuttosto che qualcos’altro chiamato pippo.
  4. 17

    Non è consentito farlo, ma si può fare questo

    typedef Foo<> Fooo;

    e quindi fare

    Fooo me;
    • c’è differenza in questo con un tipo di default e: typedef Foo<float> Fooo;, senza un tipo di default?
    • Il C++11-ish modo, sarebbe a dire using Fooo = Foo<>;

Lascia un commento