2012-04-01 7 views
0

Ich versuche, eine Vorlagenklasse in C++ zu schreiben und diesen seltsamen Linkerfehler zu bekommen und kann die Ursache nicht herausfinden, lass mich bitte wissen, was falsch ist mit diesem! HierC++ - Linkerfehler im Vorlagenkonstruktor: "nicht aufgelöstes externes Symbol"

ist die Fehlermeldung, die ich immer bin in Visula C++ 2010.

1>------ Rebuild All started: Project: FlashEmulatorTemplates, Configuration: Debug Win32 ------ 
1> main.cpp 
1> emulator.cpp 
1> Generating Code... 
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall flash_emulator<char>::flash_emulator<char>(char const *,struct FLASH_PROPERTIES *)" ([email protected]@@[email protected][email protected]@@Z) referenced in function _main 
1>C:\Projects\FlashEmulator_templates\VS\FlashEmulatorTemplates\Debug\FlashEmulatorTemplates.exe : fatal error LNK1120: 1 unresolved externals 
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ========== 

Fehlermeldung in g ++

main.cpp: In function âint main()â: 
main.cpp:8: warning: deprecated conversion from string constant to âchar*â 
/tmp/ccOJ8koe.o: In function `main': 
main.cpp:(.text+0x21): undefined reference to `flash_emulator<char>::flash_emulator(char*, FLASH_PROPERTIES*)' 
collect2: ld returned 1 exit status 

Es gibt 2 CPP-Dateien und 1-Header-Datei, und ich habe sie unten gegeben.

emulator.h

#ifndef __EMULATOR_H__ 
#define __EMULATOR_H__ 

typedef struct { 
    int property; 
}FLASH_PROPERTIES ; 

/* Flash emulation class */ 
template<class T> 
class flash_emulator 
{ 
private: 
    /* Private data */ 
    int key;  

public: 
    /* Constructor - Opens an existing flash by name flashName or creates one with 
     given FLASH_PROPERTIES if it doesn't exist */ 
    flash_emulator(const char *flashName, 
         FLASH_PROPERTIES *properties); 

    /* Constructor - Opens an existing flash by name flashName or creates one with 
     given properties given in configFIleName */ 
    flash_emulator<T>(char *flashName, 
         char *configFileName); 

    /* Destructor for the emulator */ 
    ~flash_emulator(){ 
    } 
}; 

#endif /* End of __EMULATOR_H__ */ 

emulator.cpp

#include <Windows.h> 
#include "emulator.h" 

using namespace std; 


template<class T>flash_emulator<T>::flash_emulator(const char *flashName, 
                FLASH_PROPERTIES *properties) 
{ 
    return; 
} 

template<class T>flash_emulator<T>::flash_emulator(char *flashName, 
           char *configFileName) 
{ 
    return; 
} 

main.cpp

#include <Windows.h> 
#include "emulator.h" 

int main() 
{ 
    FLASH_PROPERTIES properties = {0}; 
    flash_emulator<char> myEmulator("C:\newEMu.flash", &properties); 

    return 0; 
} 

Antwort

5

Sie zu d haben efine Template-Funktionen in sichtbaren Headern.

die Definition von

Bewegen
template<class T> flash_emulator<T>::flash_emulator(const char *flashName, 
            FLASH_PROPERTIES *properties) 

und

template<class T> flash_emulator<T>::flash_emulator(char *flashName, 
          char *configFileName) 

von emulator.cpp in emulator.h.

+0

Danke !!! Aber kann ich meine Funktionen nicht in verschiedenen Quelldateien definieren !!! Setzen Sie alle meine Funktionen in Header selbst macht es hässlich, nicht wahr? Ich sollte diesen Code als eine Bibliothek geben, also werde ich in diesem Fall nur eine große Datei emulator.h in meinem Projekt haben! – Microkernel

+0

@Microkernel: Ja, das ist die Art, wie Sie Vorlagenfunktionen ausführen müssen. Die populäre [Boost] (http://www.boost.org/) Bibliothek ist fast * vollständig * in Header-Dateien implementiert. –

+0

@Microkernel: Dies ist bekannt als eine Header-only-Bibliothek und ist ein weit verbreitetes Paradigma in C++. Fühlen Sie sich gut über die Tatsache, dass C++ Header-Bibliotheken können hohe Gebäude springen und sind schneller als eine Geschwindigkeitsüberschreitung. Der Compiler kann alle möglichen Kompilierungszeitoptimierungen durchführen, die sonst nicht möglich wären. –

Verwandte Themen