überladene Funktion



  • samkirchner schrieb:

    Wie bereits gesagt, ich glaube das es an der Eingabe Funktion scheitert, doch wieso kennt er diese nicht? Sie ist doch schon früher deklariert. 😕

    1. Bitte Fehler posten
    2. Die Funktion Eingabe ist in Berechnung.cpp NICHT bekannt, warum sollte sie es sein?


  • MVS 2008 gibt mir folgende Information:

    error C3861: "Eingabe": Bezeichner wurde nicht gefunden.

    und diese 3 Mal. Wenn ich nun doppelklicke, dann springt er zu den Funktionsaufrufen!

    Ich habe in der Zwischenzeit auch schon mal versucht die Funktion Eingabe() mit in die Berechnung.cpp + Berechnung.h zu werfen, aber dann kommt folgender Fehler:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl Eingabe<char>(char &)" (??$Eingabe@D@@YAXAAD@Z)" in Funktion "_main".

    sowie

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    muss nochmal die Hilfe von Prototype template aufrufen, vlt hilft das bei dem unteren Fehler, der obige ist mir jedoch ein Rätsel und hat viel Zeit gekostet.



  • blub² schrieb:

    1. Die Funktion Eingabe ist in Berechnung.cpp NICHT bekannt, warum sollte sie es sein?

    Muss die es sein? Hatte ich zwar auch schon versucht, jedoch liegt sie in der main.cpp, das müsste das Prog doch wissen oder nicht?

    Klar wird Sie in der Berechnung.cpp verwendet, mom versuch es nochmal habs glaub nur in der Berechnung.h versucht gehabt!



  • samkirchner schrieb:

    Muss die es sein? Hatte ich zwar auch schon versucht, jedoch liegt sie in der main.cpp, das müsste das Prog doch wissen oder nicht?

    Ja, muss sie.

    samkirchner schrieb:

    MVS 2008 gibt mir folgende Information:

    error C3861: "Eingabe": Bezeichner wurde nicht gefunden.

    und diese 3 Mal. Wenn ich nun doppelklicke, dann springt er zu den Funktionsaufrufen!

    Liegt daran dass die Funktion nicht bekannt ist.

    samkirchner schrieb:

    Ich habe in der Zwischenzeit auch schon mal versucht die Funktion Eingabe() mit in die Berechnung.cpp + Berechnung.h zu werfen, aber dann kommt folgender Fehler:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl Eingabe<char>(char &)" (??$Eingabe@D@@YAXAAD@Z)" in Funktion "_main".

    sowie

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    muss nochmal die Hilfe von Prototype template aufrufen, vlt hilft das bei dem unteren Fehler, der obige ist mir jedoch ein Rätsel und hat viel Zeit gekostet.

    In Berechnung.cpp UND Berechnung.h?

    Dann müsstest du eigentlich erstmal einen Fehler bekommen weil 2x definiert!



  • samkirchner schrieb:

    Muss die es sein? Hatte ich zwar auch schon versucht, jedoch liegt sie in der main.cpp, das müsste das Prog doch wissen oder nicht?

    Woher sollte es das? Beim Compilieren der berechnung.cpp ist der Inhalt der main.cpp völlig unbekannt.

    Informier dich mal bei google und im Buch deiner Wahl darüber, wie man Sourcecode in mehrere Übersetzungseinheiten aufteilt und wie der Compiler mit diesen Übersetzungseinheiten arbeitet. Scheinbar fehlt dir da noch der nötige Durchblick (was keine Schande ist)



  • pumuckl schrieb:

    samkirchner schrieb:

    Muss die es sein? Hatte ich zwar auch schon versucht, jedoch liegt sie in der main.cpp, das müsste das Prog doch wissen oder nicht?

    Woher sollte es das? Beim Compilieren der berechnung.cpp ist der Inhalt der main.cpp völlig unbekannt.

    Informier dich mal bei google und im Buch deiner Wahl darüber, wie man Sourcecode in mehrere Übersetzungseinheiten aufteilt und wie der Compiler mit diesen Übersetzungseinheiten arbeitet. Scheinbar fehlt dir da noch der nötige Durchblick (was keine Schande ist)

    Bei der Gelegenheit am besten gleich auch noch auf Besonderheiten von Template Funktionen in der Beziehung achten!



  • Ihr seid fix. Als ich anfegangen habe, eine Antwort zu schreiben, gab's erst nur eine einzige Antwort. 🙂

    Der Compiler streikt wahrscheinlich, wenn Du Berechnung.cpp übersetzen willst; denn Du benutzt da etwas ( Eingabe ), worüber der Compiler nichts weiß. Das Funktione-Template Eingabe ist nur in main.cpp deklariert.

    Typischerweise deklariert man Funktionen, die "global" benutzt werden sollen in Header-Dateien und definiert sie in genau einer Übersetzungseinheit. Somit können Module einzeln kompiliert werden, ohne dass der Compiler Deklarationen und Definitionen sich aus anderen Dateien raussuchen muss. Der Präprozessor ersetzt #include "mein_header.hpp" schon direkt durch den Dateiinhalt und wirft dem Compiler das Ergebnis zum Fraß vor.

    void foo();   // Deklaration
    void foo() {} // Definition
    

    Bei Funktions-Templates sieht es so aus, dass eine Deklaration i.d.R. nicht ausreicht. Aus praktischen Gründen darf man Funktions-Templates in Header-Dateien definieren und diese Header-Dateien in mehreren Übersetzungseinheiten einbinden, ohne dass sich der Linker über die Mehrfachdefinitionen beschweren wird.

    Dei Problem kann also gelöst werden, indem Du das Funktionstemplate Eingabe in eine Eigene Header-Datei schreibst und diese dort einbindest, wo Du es brauchst:

    #ifndef EINGABE_HPP_INCLUDED
    #define EINGABE_HPP_INCLUDED
    
    #include <iostream>
    
    // in Header-Dateien solltest Du  using namespace std;  vermeiden
    
    template<typename T>
    void Eingabe(T & a) {
      ...
    }
    
    #endif // EINGABE_HPP_INCLUDED
    


  • blub² schrieb:

    In Berechnung.cpp UND Berechnung.h?

    Dann müsstest du eigentlich erstmal einen Fehler bekommen weil 2x definiert!

    Nein, sry unklar ausgedrückt:

    Ich meinte ich habe Sie in der Berechnung.h bekanntgegeben und in der Berechnung.cpp verwendet, jedoch kommt da ständig:

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

    Nun erkennt er die Funktion Eingabe nicht mehr in main.cpp 😕

    Wenn ich nun das Eingabe(auswahl) durch cin>>auswahl ergänze, dann funzt es.

    pumuckl schrieb:

    Informier dich mal bei google und im Buch deiner Wahl darüber, wie man Sourcecode in mehrere Übersetzungseinheiten aufteilt und wie der Compiler mit diesen Übersetzungseinheiten arbeitet. Scheinbar fehlt dir da noch der nötige Durchblick (was keine Schande ist)

    Ja, darüber habe ich noch nie was gelesen :(. Hast du da zufällig ein brauchbaren Link im Kopf, wenn net google ich mal danach.



  • @krümelkacker

    vielen Dank, das hat was gebracht 👍

    Kann ich das als algemeine Regel nehemen? Ich meine immer wenn ich ein template verwende welches auch in anderen Funktionen funktionieren soll?

    Aber ich denke mal das ich eh bei der Aufgabe

    [qoute="pumuckl"]
    "wie man Sourcecode in mehrere Übersetzungseinheiten aufteilt"
    [/quote]

    darüber stolpern werde 😉

    Danke dir vielmals!

    @pumuckl: das mit dem Link steht dennoch 😉 (falls du einen leicht verständlichen kennst)



  • Huch, ganz übersehn dass es bei Eingabe um eine Template-Funktion ging.

    Hättest du allerdings in die FAQ geschaut, wäre dir im Inhaltsverzeichnis der Link zum Thema "undefined reference" aufgefallen, wo ich die drei häufigsten Ursachen für diese Fehlermeldung zusammengefasst habe. Eine davon ist die Definition von Templates in .cpp-dateien statt im Header.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-246875.html



  • @pumuckl, danke habe ich nun gelesen, leider ist es nicht so einfach was in einer sufu, FAQ zu finden wenn man nichtmal weiß nach was man sucht 😉 auch google hilft einem Anfänger nicht oft und komfortabel weiter ;)! Jedoch habe ich ja dieses Forum entdeckt 👍


Anmelden zum Antworten