in direzione giusta? C ++ e modelli di classe

1

Sto lavorando su un codice ereditato in C ++ e sto cercando di usare 2 classi con i template perché ho bisogno di 2 tipi di ogni classe per operare su dati in virgola mobile o interi (double v uint64_t per essere precisi).

Nelle due classi che sto cercando di "templatizzare" (?), l'una eredita dall'altra. Le definizioni dei dati necessarie per entrambi sono definite nella classe "più base", alcune con il nome di parametro "T", e alcune con tipi risolti (ad esempio "int") nella sezione "protected:".

Il file di implementazione (.cc) corrispondente per la maggior parte della classe base compila 'ok', ma il file di implementazione per la classe derivata (che è anche 'templated') non vede i dati della classe dal primo template.

Penso che il file di classe derivato voglia vedere una versione risolta della definizione del modello della classe base più, ma non sono sicuro.

Esempio: più file modello di classe base (.h) ha:

template < typename T > class FieldMeter : public Meter {
...
protected:
    int numfields_;
    F *fields_;
    F total_, used_, lastused_;
...
};

file di classe meno base (.h):

template <typename T> class FieldMeterGraph : public FieldMeter <T> {
    ...
}

Il problema si presenta in un file .cc di classe meno base quando si accede a 'numfields_' o "campi _":

fieldmetergraph.cc:51:24: error: ‘numfields_’ was not declared in this scope
  if (!heightfield_  && numfields_>0 && graphNumCols_ >0)

Quando entrambe erano classi semplici, non avevo capito quanto sopra, quindi è un caso dove i dati vengono dichiarati in base più, la classe 'templatized' non è accessibile nell'implementazione di un modello derivato.

La mia terminologia potrebbe essere un po 'off - ma sembra che dovrebbe essere così fattibile - con "classi finali" come " cpumeter " che passerebbe a tipo di dati solidi ( uint64_t ) al modello di toplevel FieldMeterGraph .

Sono tentato di ricorrere alla memorizzazione del tipo in fase di compilazione e di esecuzione la risoluzione manualmente, in fase di esecuzione come farei in "C", ma come me capirlo, questo dovrebbe essere risolvibile dal compilatore (usando g ++ C ++ 11), in fase di compilazione.

Ho la 4a tomba di Stroustrup come riferimento, ma sembra i suoi esempi tendono ad essere un po 'troppo generico per me per derivare correttamente un esempio risolvibile e concreto che piace a g ++ (anche se i messaggi di errore di g ++ sembrano essere straordinariamente più utili e precisi rispetto a quelli che normalmente ottengo in perl ..) ....

Se qualcuno sa come risolvere più velocemente il mio enigma, che provi a caso varie cose che non funzionano, sarebbe apprezzato! ; -)

Grazie!

    
posta Astara 02.05.2014 - 22:47
fonte

1 risposta

2

Lo standard C ++ non richiede la ricerca di nomi non dipendenti (cioè non dipendenti dal parametro template) in basi dipendenti, quindi non esiste una soluzione "migliore", a parte affidarsi a comportamenti non standard di determinati compilatori.

Il suggerimento che hai ricevuto da @Sjoerd nei commenti è appropriato, poiché this è un nome implicitamente dipendente. In genere, è possibile utilizzare uno dei seguenti moduli:

  • this->member_;
  • FieldMeter<T>::member_;

Si noti che mentre quanto sopra è identico in effetti per un campo, devi fare la distinzione attentamente quando hai a che fare con i metodi virtuali, ad esempio FieldMeter<T>::get_member_() vs. this->get_member_() , poiché il primo non farà un invio virtuale.

    
risposta data 05.05.2014 - 12:32
fonte

Leggi altre domande sui tag