Nach meiner Entdeckung der Inkonsistenz zwischen MSVC und GCC (wahrscheinlich auch klingeln) beim Kompilieren und Verknüpfen desselben Codes, bin ich neugierig geworden, sollte dieses Programm tatsächlich kompilieren und verlinken und es ist daher ein Bug in MSVC (der einen Linkerfehler meldet) oder sollte ich es anders schreiben. Das Programm besteht aus drei Dateien:Sollte das folgende Programm standardmäßig kompilieren?
Ch
template <typename T>
struct A
{
void func() {};
};
template <>
void A<int>::func();
A.cpp:
#include "C.h"
int main()
{
A<int> x;
x.func();
}
B.cpp:
#include "C.h"
template <>
void A<int>::func()
{
}
Der resultierende Linker-Fehler von MSVC ist:
A.OBJ: Fehler LNK2019: nicht aufgelöstes externes Symbol "public: void __thiscall A :: func (void)"
Also im Grunde entscheidet es nicht Symbol aus Definition in B.cpp
platziert zu erstellen. Die Sache, die mich stark als einen Fehler vermuten lässt, ist, dass das Verschieben der unspezialisierten Definition von func
aus der Strukturdefinition und sogar das Überschreiben der Deklaration oberhalb der Spezialisierung das Programm linnking erfolgreich macht, aber ich möchte sicher sein.
Also meine Frage ist - sollte dieses Programm kompiliert und fehlerfrei von einem Compiler/Linker verknüpft werden?
Sieht für mich wie ein Fehler aus. Verwenden Sie die neueste (2015) Version von MSVC? –
@MatsPetersson Ja, 2015. – Predelnik
Ihr Code kompiliert auch mit clang ++ gut.Es ist ein bisschen komisch tho ', da du im Wesentlichen zwei Definitionen für 'func' bereitstellst - ich bin nicht genug eines Sprachanwalts, um zu sagen, ob das richtig ist oder nicht (ich denke es ist) –