none
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


    Sonntag, 1. Juli 2018 20:14

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

    Montag, 2. Juli 2018 08:16

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

    Montag, 2. Juli 2018 08:16
  • Perfekt! Vielen Dank :-)

    Viele Grüße Holger M. Rößler

    Montag, 2. Juli 2018 09:22