2012-01-13 17 views
8

Sono un novizio C++. Oggi, ho un problema: nel file di intestazione, ho definire una classe:Errore C++: dichiarazione membro non trovata

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

e nel file sorgente, programmo come:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

quando compilato, il compilatore dicono sempre: 'Stati dichiarazione non trovata '. perché?

Io uso Eclipse CDT + Cygwin GCC

vi ringrazio molto!

+1

AFAIK non si deve implementare una classe template in un file sorgente. Imposta la definizione della funzione nell'intestazione. – Lucian

risposta

6

Le classi di modelli devono essere dichiarate e definite nell'intestazione o in un altro file che è incluso dagli utenti. Non possono essere dichiarati in un'intestazione e definiti come in un file sorgente come al solito.

Il ragionamento è che il modello deve essere sostituito con un tipo effettivo e l'origine per quello generato e compilato quando utilizzato, e il compilatore non può certamente precompilare i modelli per ogni possibile tipo che può arrivare, quindi gli utenti devono essere in grado di gestirlo (e quindi, è necessario l'accesso al codice).

Ciò causa alcuni problemi durante il passaggio di oggetti, se più librerie includono gli stessi modelli, poiché possono essere compilati con versioni diverse dell'intestazione (vedere la regola Definizione singola).

0

È necessario includere il file di origine alla fine del file di intestazione oppure definire funzione di membro nel file di intestazione quando si definisce una classe modello

1

"dichiarazione Utente non trovato" è un errore prodotto dal analisi statica Eclipse strumento (codan) piuttosto che il compilatore. Se si ottiene questo errore, ma la compilazione ha esito positivo, si tratta di un falso positivo. È noto che versioni precedenti di questo strumento forniscono alcuni falsi positivi, ad esempio this bug report. Quindi consiglio di aggiornare Eclipse CDT alla versione più recente. Se questo non aiuta, inviare una segnalazione di bug a Eclipse CDT.

Tuttavia, se si ricevono anche gli errori dal compilatore (questi sono indicati da C/C++ Problem nella colonna Tipo nella vista Problemi), probabilmente si è dimenticato di includere il file di intestazione.

Problemi correlati