LNK2019 mit Template-Klasse



  • Beim Versuch diesen Code zu linken, bekomm ich diese Fehlermeldung... Beim besten Willen finde ich da aber keinen Fehler drin...:

    "Test1.obj : error LNK2019: unresolved external symbol "public: __thiscall BaseTest<bool>::BaseTest<bool>(void)" (??0?BaseTest@\_N@@QAE@XZ) referenced in function "public: __thiscall Test1::Test1(void)" (??0Test1@@QAE@XZ) Test1.obj : error LNK2019: unresolved external symbol "public: virtual \_\_thiscall BaseTest::~BaseTest(void)" (??1?BaseTest@_N@@UAE@XZ) referenced in function "public: virtual __thiscall Test1::~Test1(void)" (??1Test1@@UAE@XZ)"

    Hier die 4 Quellcodes:

    BaseTest.h

    #pragma once
    #include "daoc-docdlg.h"
    
    template<class Temp> class BaseTest :
    protected   CDAoCDoCDlg
    {
    public:
    	void Adjust(Temp);			// Aufurf bei Settingänderung
    	void Fix(void);				// ruft Save auf, wenn HasChanged TRUE und aktualisiert Settings
    	                            // Aufruf bei Übernehmen
    	void Check(void);			// ruft Test auf wenn bTest=true, aktualisiert Settings und Oberfläche
    								// Aufruf bei Überprüfen
    protected:
    	bool HasChanged(void);		// vergleicht setting_old und setting_cur
    	Temp tOldSetting;			// aktuell gespeicherte Einstellungen
    	Temp tCurSetting;			// aktuell ausgewählte Einstellung
    	BaseTest(void);
    	~BaseTest(void);
    private:
    	virtual void Save(void) = 0;// Speichert aktuelle Einstellungen
    	virtual void Set(Temp) = 0;	// Aktualisiert Oberfläche
    	virtual Temp Test(void) = 0;// Testet, ob Fehler besteht, aktualisiert bTest und gibt Wert zurück
    	bool bTest;					// wird auf False gesetzt, wenn Test nicht mehr erforderlich
    };
    

    BaseText.cpp

    #include "StdAfx.h"
    #include ".\basetest.h"
    
    template <class Temp>
    BaseTest<Temp>::BaseTest(void){
    	bTest = TRUE;
    }
    
    template <class Temp>
    BaseTest<Temp>::~BaseTest(void){
    }
    
    template <class Temp>
    void BaseTest<Temp>::Adjust(Temp){
    	tCurSetting = Temp;
    }
    
    template <class Temp>
    void BaseTest<Temp>::Fix(void){
    	if(HasChanged()){
    		Save();
    		tOldSetting = tCurSetting;
    	}
    }
    
    template <class Temp>
    bool BaseTest<Temp>::HasChanged(void){
    	return(tOldSetting == tCurSetting);
    }
    
    template <class Temp>
    void BaseTest<Temp>::Check(void){
    	// testen, falls Test erforderlich ist (bTest = True)
    	if(bTest)
    		tOldSetting = Test();
    
    	// Anzeige aktualisieren, falls Einstellungen verändert wurden
    	if(HasChanged)
    		Set(tOldSetting);
    	tCurSetting = tOldSetting;
    }
    

    Test1.h

    #pragma once
    #include "basetest.h"
    
    class Test1 :
    	private  BaseTest<bool>{
    public:
    	Test1(void);
    	~Test1(void);
    private:
    	void Save(void);
    	void Set(bool);
    	bool Test(void);	// 0 = Automatischer Neustart ist aus, 1 = an
    };
    

    Test1.cpp

    #include "StdAfx.h"
    #include ".\test1.h"
    
    Test1::Test1(void){
    }
    
    Test1::~Test1(void){
    }
    
    bool Test1::Test(void){
    	// auslesen, ob automatischer Neustart momentan aktiviert ist
    	HKEY hKey;				// Handle für Key
    	DWORD dwBuf, dwSize;	// Buffer für Wert
    	dwSize = sizeof(DWORD);	// große des Buffers
    
    	RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\CrashControl", 0, KEY_QUERY_VALUE, &hKey);
    	RegQueryValueEx(hKey, "AutoReboot", NULL, NULL, (PBYTE)&dwBuf, &dwSize);
    	RegCloseKey(hKey);
    
    	return(!!dwBuf);
    }
    
    void Test1::Save(void){
    	// Registry ändern
    	HKEY hKey;	// Handle für Key
    	RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\CrashControl", 0, KEY_WRITE, &hKey);
    	RegSetValueEx(hKey, "AutoReboot", 0, REG_DWORD, (LPBYTE)&tCurSetting, sizeof(DWORD));
    	RegCloseKey(hKey);
    }
    
    void Test1::Set(bool bSetting){
    	// Automatische Neustart-Gruppe aktivieren
    	m_cnGbReset.EnableWindow(TRUE);						// Gruppe aktivieren
    	m_cnRbReset.EnableWindow(TRUE);						// Aktivierungsknopf aktivieren
    	GetDlgItem(IDC_RB_DISNEUSTART)->EnableWindow(TRUE);	// Deaktivierungsknopf aktivieren
    
    	// richtigen RB auswählen
    	m_iRbReset = !bSetting;
    }
    


  • BaseTest.cpp bis auf die includes an die BaseTest.h dranhängen, BaseTest.cpp entfernen, neu kompilieren.





  • Danke für die schnelle Hilfe und sorry, dass ich die FAQ nicht gefunden habe... habe wohl nach den falschen Schlüsselwörtern gesucht...



  • Luke1410 schrieb:

    Danke für die schnelle Hilfe und sorry, dass ich die FAQ nicht gefunden habe... habe wohl nach den falschen Schlüsselwörtern gesucht...

    das ist nix wofür man sich entschuldigen muss


Anmelden zum Antworten