Ich habe eine Klasse Dimension
, die ich (wie all meine Klassen) in einer Datei Dimension.h definiert:Kann die consExpr-Klasse in einer Kopfzeile deklariert und in einer separaten CPP-Datei definiert werden?
class Dimension
{
public:
constexpr Dimension() noexcept;
constexpr Dimension(int w, int h) noexcept;
int width;
int height;
};
Ich dachte, ich könnte, wie in allen meinen Klassen, die Definition in einem separaten Dimension.cpp setzen :
#include "Dimension.h"
constexpr Dimension::Dimension() noexcept : width(0), height(0) {}
constexpr Dimension::Dimension(int w, int h) noexcept : width(w), height(h) {}
aber wenn ich versuche, um die Klasse zu verwenden, der Compiler sagt mir:
Warnung: Inline-Funktion 'constexpr Dimension::Dimension()
' verwendet, aber nie definiert
und beim Verknüpfen:
undefinierte Bezugnahme auf 'pong::graphics::Dimension::Dimension()
'
(gleich mit dem anderen Konstruktor)
Wenn ich definiere, die Klasse in dem Header wie folgt:
class Dimension
{
public:
constexpr Dimension() noexcept : width(0), height(0) {}
constexpr Dimension(int w, int h) noexcept : width(w), height(h) {}
int width;
int height;
};
und weglassen der .cpp-Datei, alles funktioniert gut.
Ich benutze GCC 4.9.2. Warum funktioniert die separate Definition nicht?
Der ganze Sinn einer constexpr-Funktion besteht darin, die Funktion zur Kompilierzeit auswerten zu können.Das wäre ziemlich schwierig, wenn der Compiler den Körper der Funktion nicht sehen kann. –
_ "Warum funktioniert die separate Definition nicht?" _ - Weil die Sprache dies nicht zulässt. Akzeptiere es, mach es richtig, geh weiter. –
Ich habe das schon vermutet, aber ich bin mir nicht ganz sicher, ob ich (vielleicht mit Referenzen) erklären kann, warum es genau passiert. Ich habe beim googlen nichts darüber gefunden, daher dachte ich mir, dass eine neue Frage angemessen wäre. –