Представьте, что у вас есть файл ah
#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);
, затем функция f определена в "a.cpp"
#include "a.h"
void f(A<int>* a){
a->f();
}
и, наконец, "main.cpp" специфицирует шаблон, а затем использует f
#include "a.h"
template<> struct A<int>{
};
int main(){
A<int> a;
f(&a);
}
Понятно компилятор использует неспециализированную версию для ao и специализированную версию для main.o, т.е. есть две разные реализации A. При выполнении f может вывести только мусор/segfault, потому что переданный объект имеет структуру, отличную от ожидаемой.
Есть ли способ заставить компоновщик предупреждать о наличии двух версий A?