C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...
-
Moin @manni66 ,
kann ich so leider nicht sagen, auf was möchtest du hinaus?
Viele Grüße!
-
@tobi9595
Es kommt nur in einer Datei vor.
-
Dieser Beitrag wurde gelöscht!
-
@manni66
Also ich eröffne den Namensraum in maxFunctionHeader.h, wobei ich das Grundgerüst der Funktion festlege. Ausformuliert wird diese anschließend in maxFunction.cpp .
Diesen Namensraum rufe ich in Main.cpp ja wieder auf, sodass ich die Funktion theoretisch ohne math::max verwenden kann.
Wie meinst du denn dass der nur in einer Datei vorkommt, was müsste ich anpassen?
-
Das im Header ist eine Funktionsdeklaration, das im Source-File (.cpp) ist eine Funktionsdefinition. Die Deklaration von
max()
ist imnamespace
Namensmath
, die Deklaration aber nicht, also ist die im Source-File definierte Funktionmax()
eine andere als die im Header deklarierte Funktionmath::max()
.Das sagt dir mit
LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl math::max(int,int)" (?max@math@@YAHHH@Z)" in Funktion "main".
auch Dein Linker:
math::max()
ist undefiniert.
-
Alles klar, dankeschön, das leuchtet mir jetzt ein, dann muss ich also die Funktion in maxFunction.cpp auch mit in den namespace nehmen.
Ich habe mich an folgendem Beispiel welches ich gefunden habe orientiert, aus welchen Gründen ist dort kein weiterer namespace erforderlich?main.cpp
#include <iostream> #include "add.h" using namespace std; int main() { cout << "The sum of 3 and 4 is" << add(3,4) << endl; return 0; }
add.cpp
#include "add.h" int add(int x, int y) { return x+y; }
add.h
#ifndef ADD_H #define ADD_H int add(int x, int y); #endif // ADD_H
.
Viele Grüße & dankeschön!
-
@tobi9595 sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:
aus welchen Gründen ist dort kein weiterer namespace erforderlich?
Weil man Funktionen oder sonstwas nicht in Namespaces stecken muss.
Das da:
@tobi9595 sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:
using namespace std; using namespace math;
ist übrigens mit Vorsicht zu genießen weil das alle Symbole der Namespaces
std
undmath
in den globalen Namespace "ausschüttet". Instd
gibt es (den richtigentm Header inkludiert) auch einmax()
.Man kann auch einzelne Symbole in den aktuellen Namensraum bringen:
using std::cout; using math::max;
-
@Swordfish Alles klar, super ich danke dir!!!
Ich konnte den Fehler auch bei dem nachträglich Code nachstellen, ich denke ich habe es verstanden!
Danke euch!
-
Ach so, nebenbei: Visual Studio wäre auf Englisch nicht verkehrt. Dann spuckt der Compiler/Linker
cl.exe
ein wenig verständlichere und leichter googlebare Fehlermeldungen aus.
-
@Swordfish sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:
Ach so, nebenbei: Visual Studio wäre auf Englisch nicht verkehrt. Dann spuckt der Compiler/Linker
cl.exe
ein wenig verständlichere und leichter googlebare Fehlermeldungen aus.Oder sonst nur nach der Fehlernummer + "error" suchen, und die deutschen Begriffe weglassen.
-
oder einfach nochmal einen blick ins buch werfen und vergleichen.