Imagine que tiene un archivo ahg ++, requieren la advertencia enlazador/error para la especialización múltiple plantilla
#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);
entonces la función f se define en "a.cpp"
#include "a.h"
void f(A<int>* a){
a->f();
}
y, finalmente, " main.cpp" se especializa la plantilla, y luego utiliza f
#include "a.h"
template<> struct A<int>{
};
int main(){
A<int> a;
f(&a);
}
Claramente el compilador utiliza la versión no especializado para Ao, y el versión especializada para main.o, es decir, hay dos implementaciones diferentes de A. En ejecución, f solo puede imprimir basura/segfault porque el objeto pasado tiene una estructura diferente de la esperada.
¿Hay alguna manera de hacer que el enlazador advierta que hay dos versiones de A?
Es un problema bastante difícil de resolver, por lo que no hay un diagnóstico obligatorio para esto. – Flexo
HTH: elimine todas las plantillas de la pregunta, y obtendrá el mismo resultado. Deje solo la declaración de avance en a.h de struct A; y mover la versión completa a a.cpp. main.cpp - sólo eliminar la plantilla ... – PiotrNycz