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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.