Po odkryciu niespójności między MSVC i GCC (prawdopodobnie też klang) w kompilacji i powiązaniu tego samego kodu, stałem się ciekawy, czy ten program faktycznie się kompiluje i łączy, a tym samym jest to błąd w MSVC (który zgłasza błąd linkera) czy powinienem napisać to inaczej. Program składa się z 3 plików:Czy następujący program powinien się kompilować zgodnie ze standardem?
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()
{
}
Uzyskany błąd jest łącznikiem z MSVC:
A.obj: error LNK2019: nierozwiązanych zewnętrznych symbolu "public: void __thiscall A :: func (void)"
Więc w zasadzie to nie zdecyduje się utworzyć symbol z definicji umieszczonej w B.cpp
. To, co sprawia, że mocno podejrzewam, że jest to błąd, polega na tym, że przeniesienie niespecjalistycznej definicji z definicji struct, a nawet umieszczenie jej powyżej deklaracji specjalizacyjnej sprawia, że program linnkingowy jest udany, ale chciałbym być tego pewien.
Moje pytanie brzmi - czy ten program powinien być skompilowany i połączony bez błędów przez zgodny kompilator/linker?
Wygląda jak błąd dla mnie. Czy korzystasz z najnowszej (2015) wersji MSVC? –
@MatsPetersson Tak, 2015. – Predelnik
Twój kod kompiluje się dobrze z klang ++.To trochę dziwne, ponieważ zasadniczo podajesz dwie definicje dla 'func' - nie jestem wystarczającym językiem-prawnikiem aby powiedzieć, czy to jest poprawne czy nie (myślę, że to jest) –