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!