Wyobraź masz ah plikówg ++, wymagają łącznik ostrzegawczy/błąd dla wielu szablonu specjalizacji
#include <iostream>
template<typename T> struct A{
int magic;
A():magic(1234){}
void f(){std::cout<<"default f"<<magic<<std::endl;}
};
void f(A<int>* a);
to funkcja f jest określona w "a.cpp"
#include "a.h"
void f(A<int>* a){
a->f();
}
i wreszcie " main.cpp”specjalizuje się szablon, a następnie używa f
#include "a.h"
template<> struct A<int>{
};
int main(){
A<int> a;
f(&a);
}
Oczywiście kompilator używa non specjalistyczną wersję dla AO, a Specjalna wersja dla main.o, tj. zdarzają się dwie różne implementacje A. Podczas wykonywania, f może drukować tylko śmieci/segfault, ponieważ przekazany obiekt ma inną strukturę niż oczekiwana.
Czy istnieje sposób, aby linker ostrzegł, że istnieją dwie wersje A?
Jest to dość trudny problem do rozwiązania, dlatego nie ma obowiązkowej diagnostyki dla tego. – Flexo
HTH: usuń wszystkie szablony z pytania - a otrzymasz taki sam wynik. Pozostaw tylko deklarację przekazania w a.h struktury A; i przenieś pełną wersję do a.cpp. main.cpp - tylko usunąć szablon ... – PiotrNycz