Benutzer mit den meisten Antworten
Linkerfehler! Warum?

Frage
-
Hallo zusammen,
ich habe eine einfache template Klasse in C++ geschrieben. Diese wird auch ohne Probleme kompiliert und gelinkt. Sowie ich aber im gleichen Projekt (Win32 Konsolenanwendung) in der main-Methode die Klasse verwenden, erfolgt für jeden Member den ich aufrufe ein Linkerfehler..."Nicht aufgelöstes externes Symbol".Den Header habe ich eingebunden und Intellisense erkennt auch alles ohne Probleme!?!?!
Header:
#ifndef __ValueRange_H #define __ValueRange_H template<class T> class ValueRange { private: T lowerLimit; T upperLimit; T value; public: ValueRange(T, T, T); ~ValueRange(void); bool isInRange(T) const noexcept; T getUpperLimit(void) const noexcept; T getLowerLimit(void) const noexcept; T getValue(void) const noexcept; bool setValue(T); void operator=(T); bool operator == (T) const noexcept; bool operator >= (T) const noexcept; bool operator <= (T) const noexcept; bool operator != (T) const noexcept; }; #endif // ! _ValueRange_H
Das Sourcefile:
#include "stdafx.h" #include "ValueRange.h" template<class T> ValueRange<T>::ValueRange(T lowerLimit, T upperLimit, T value) { this->lowerLimit = lowerLimit; this->upperLimit = upperLimit; this->setValue(value); } template<class T> ValueRange<T>::~ValueRange(void) {} template<class T> bool ValueRange<T>::setValue(T value) { bool result = false; if (value >= this->lowerLimit && value <= this->upperLimit) { this->value = value; result = true; } return result; } template<class T> T ValueRange<T>::getValue(void) const noexcept { return this->value; } template<class T> bool ValueRange<T>::isInRange(T value) const noexcept { return value <= this->upperLimit && value >= this->lowerLimit; } template<class T> T ValueRange<T>::getLowerLimit(void) const noexcept { return this->lowerLimit; } template<class T> T ValueRange<T>::getUpperLimit(void) const noexcept { return this->upperLimit; } template<class T> void ValueRange<T>::operator=(T value) { this->setValue(value); } template<class T> bool ValueRange<T>::operator==(T other) const noexcept { return this->value == other; } template<class T> bool ValueRange<T>::operator!=(T other) const noexcept { return this->value != other; } template<class T> bool ValueRange<T>::operator>=(T other) const noexcept { return this->value >= other; } template<class T> bool ValueRange<T>::operator<=(T other) const noexcept { return this->value <= other; }
Und die main:
#include "stdafx.h" #include "ValueRange.h" using namespace std; int main() { ValueRange<int> vr(0,10,5); int lower = vr.getLowerLimit(); int upper = vr.getUpperLimit(); int value = vr.getValue(); return 0; }
Danke für eure Hilfe! :)
@Edit: Achja ich verwende VS2017 Community...
Viele Grüße Holger M. Rößler
- Bearbeitet Holger M. Rößler Sonntag, 1. Juli 2018 20:17 @Edit
Antworten
-
Hallo,
solange das template nicht benutzt wird, wird auch kein Code dafür erzeugt.
Der Linker meckert, weil die template Definitionen in den Header gehören. Ich schreibe immer eine hpp Datei und include sie am Ende der h-Datei ein. Mach aus deiner cpp eine hpp und füge ans Ende deiner ValueRange.h:
#include "ValueRange.hpp"
Ausserdem muss die hpp dann noch vom Build ausgeschlossen werden (Eigenschaften -> Allgemein -> Vom Build ausschließen -> Ja).
Gruß Guido
- Als Antwort markiert Holger M. Rößler Montag, 2. Juli 2018 09:22
Alle Antworten
-
Hallo,
solange das template nicht benutzt wird, wird auch kein Code dafür erzeugt.
Der Linker meckert, weil die template Definitionen in den Header gehören. Ich schreibe immer eine hpp Datei und include sie am Ende der h-Datei ein. Mach aus deiner cpp eine hpp und füge ans Ende deiner ValueRange.h:
#include "ValueRange.hpp"
Ausserdem muss die hpp dann noch vom Build ausgeschlossen werden (Eigenschaften -> Allgemein -> Vom Build ausschließen -> Ja).
Gruß Guido
- Als Antwort markiert Holger M. Rößler Montag, 2. Juli 2018 09:22