Problem mit als "inline" deklarierten Methoden bzw. Funktionen
-
Ich habe eine Klasse "Vec3", die in einer Klasse "Matrix" verwendet wird. Der Code ist nicht meiner, ist aus meiner Sicht aber völlig konform:
1. Deklaration:inline Vec3 operator - (const Vec3 &V);2. Definition:
inline Vec3 operator - (const Vec3 &V) { Vec3 Result; Result.x = -V.x; Result.y = -V.y; Result.z = -V.z; return Result; }Das Kompilieren der Matrix-Klasse schlägt fehl:
[C++ Fehler] Matrix.cpp(555): E2451 Undefiniertes Symbol 'operator -(const Vec3 &)'
(#include "Vector.h" ist natürlich gegeben)
Wenn ich das inline-Schlüsselwort entferne, ist alles in Butter. Dasselbe Phänomen übrigens auch bei diversen anderen Funktionen.
Fehlt in meinem C++-Handbuch eine Seite, oder ist das eine Besonderheit vom Borland C++ Builder (BDS2006)? Meines Wissens müsste der Kompiler die inline-Direktive(n) (die vor der Definition reicht eigentlich) einfach ignorieren, wenn ihm die Geschichte zu umständlich wird.
-
Das hat hier mit dem inline aber nichts zu tun. Hier scheint lediglich bei der Definition der Klassenbezeichner zu fehlen
inline Vec3 Vec3::operator - (const Vec3 &V) { Vec3 Result; Result.x = -V.x; Result.y = -V.y; Result.z = -V.z; return Result; }Ein Hinweis:
Der Operator - (wie auch +, *, /) sollte besser global sein.
-
Braunstein schrieb:
Das hat hier mit dem inline aber nichts zu tun. Hier scheint lediglich bei der Definition der Klassenbezeichner zu fehlen
Wenn es der binäre Minusoperator wäre, hättest du völlig Recht. Ich habe ein verwirrendes Beispiel gewählt, sorry. Es handelt sich hier um das unäre Minus (also sozusagen das Minuszeichen im Sinne von "-a + b"), in einer globalen Funktion.
Der beschriebene Effekt tritt auch bei anderen Funktionen auf. Und wenn ich "inline" entferne, kompiliert es sich einwandfrei.
Der Autor hat übrigens fast alle Vektor- und Matrixfunktionen mit "inline" versehen, was ich sowieso für Unsinn halte. Aber trotzdem wurmt es mich massiv, wenn sich der BCB an diesem (aus meiner Sicht korrekten) C++ verschluckt.
Vielen Dank für den (nachvollziehbaren) Gedanken übrigens!
-
frag doch mal direkt im c++-forum ob der code so gültiges c++ ist. wenn ja dann kann es der bcb nicht. allerdings fände ich 2-mal inline zu viel.
besteht die vector-klasse aus einer header (h) und eine source-datei (cpp) oder ist das alles im header? ist in der cpp dann der header inkludiert? und in der matrix-klasse auch?
soweit ich weiss und mich erinnere dürfen inline-funktionen nur im header stehen (borland), sonst werden die nicht gefunden und dann kannste die deklaration weglassen. :schland: