Problem Template Arduino 1.6.1 IDE

OP #4061238
Lesenswert?

Hallo Community,
ich habe ein Problem ein Template auf meinen Arduino UNO
umzusetzen. Und erbitte hiermit um Rat von euch.
----------------------------------------------------------------------
//TemplateClass2.ino
#include "Header.h"
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}
//Instanz anlegen
Schatztruhe <int> EineTruhe;

void loop() {
 //FEHLER? WARUM?
 EineTruhe.setSchatz(12);
              //Und wieder ????
Serial.println( EineTruhe.getSchatz() ) ;
delay(750);
}
---------------------------------------------------------------------
//Header.h
#include"Arduino.h"
#ifndef HEADER_H
#define HEADER_H

template <typename T>
class Schatztruhe
{
 private:
 T schatz;
 public:
 void setSchatz(T In);
 T getSchatz();
};
#endif
----------------------------------------------------------------
//Code.cpp
#include"Header.h"

template <typename T>
void Schatztruhe<T>::setSchatz(T In)
{
  schatz = In;
}

template <typename T>
T Schatztruhe<T>::getSchatz()
{
  return schatz;
}
-----------------------------------------------------------------
Fehlermeldung Arduino IDE
Arduino: 1.6.1 (Windows 7), Platine: "Arduino Uno"

TemplateClass2.cpp.o: In function `loop':

C:\Program Files (x86)\Arduino/TemplateClass2.ino:12: undefined 
reference to `Schatztruhe<int>::setSchatz(int)'

C:\Program Files (x86)\Arduino/TemplateClass2.ino:14: undefined 
reference to `Schatztruhe<int>::getSchatz()'

collect2.exe: error: ld returned 1 exit status

Fehler beim Kompilieren.

Gruß Meik
OP #4061247
Lesenswert?

Kleiner Anhang noch. Alles in die X.ino und es läuft!?
--------------------------------------------------------
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

template <typename T>
class Schatztruhe
{
  private:
  T schatz;
  public:
  void setSchatz(T s)
  {
    this->schatz=s;
  }
  T getSchatz()
  {
   return this->schatz;
  }
};

void loop() {
Schatztruhe <unsigned int> Zahl;
Schatztruhe <boolean> Bool;
Bool.setSchatz(true);
Zahl.setSchatz(1);

while(true)
          {
           Serial.print("Zahl= ");
           Serial.println(Zahl.getSchatz());
           Zahl.setSchatz( (Zahl.getSchatz()) +1);
           Serial.print("Bool= ");
           Serial.println(Bool.getSchatz());
           delay(750);
          }
}
--------------------------------------------------------------
So funktioniert es Anstandslos!!!
Gast #4061263
Lesenswert?

Templates kannst du nicht in einer Quellcode-Datei definieren, sondern 
nur im Header. Wie soll das denn gehen? Wie sonst soll der Kompiler die 
Methoden für den einen Typ generieren, wenn er den Code nicht kennt. 
Wenn du das nicht verstehst solltest du dir den Kompilieren-Linken 
Vorgang genauer ansehen.
OP #4061300
Lesenswert?

Erstmal Danke für die schnelle Antwort. ;)

Wie du mir das gerade erklärst  macht das schon,auch für mich 
Hobby-Informatiker, Sinn.

Soweit ich das mit der Aufteilung von den Modulen verstanden habe 
(ACHTUNG LAIE!). Da diese getrennt Kompiliert werden oder die x.cpp auch 
nur kompilert
vorliegt. Können die Methoden die zu Übergebenen Daten(Typen) noch gar 
nicht
kennen "Die sitzen ja auch nicht mit der Glasskugel auf dem Rummel ;)"!

Ich verstehe!!!

Dann dient der Syntax denn ich aus Fachliteratur habe. Wohl 
ausschließlich
dazu. Alles zwar in der selbe Header.h zuschreiben. Aber Deklaration und
Definition zu trennen.

//Header.h
template <T>
class Schatztruhe
{
 //Deklaration
};

template<T>
X Schatztruhe<T>::X()
{
 //Definition
}

SUPER!!!

Ich wünsche noch ein schönes Wochenende!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren