Dopo la mia scoperta di incompatibilità tra MSVC e GCC (probabilmente anche clang) nella compilazione e nel collegamento dello stesso codice, sono curioso che questo programma venga effettivamente compilato e collegato e quindi sia un bug in MSVC (che riporta un errore del linker) o dovrei scrivere diversamente. Il programma consiste di 3 file:Il seguente programma deve essere compilato secondo lo standard?
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()
{
}
L'errore di linker risultante da MSVC è:
A.OBJ: LNK2019 di errore: simbolo esterno non risolto "public: void __thiscall A :: func (void)"
Quindi, in pratica si decide di non creare il simbolo di definizione posto in B.cpp
. La cosa che mi fa fortemente sospettare che sia un bug è che spostare la definizione non specificata di func
dalla definizione della struct e persino posizionarla sopra la dichiarazione di specializzazione rende il linnking del programma riuscito, ma mi piacerebbe esserne sicuro.
Quindi la mia domanda è: questo programma dovrebbe essere compilato e collegato senza errori da un compilatore/linker conforme?
Sembra un insetto per me. Stai usando l'ultima versione (2015) di MSVC? –
@MatsPetersson Sì, 2015. – Predelnik
Il codice viene compilato bene anche con clang ++.È un po 'strano, dal momento che essenzialmente stai fornendo due definizioni per 'func' - Non sono abbastanza un avvocato della lingua per dire se è corretto o meno (penso che lo sia) –