g++, требуется предупреждение/ошибка компоновщика для множественной специализации шаблона

Представьте, что у вас есть файл 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?

12
задан Fabio Dalla Libera 18 June 2012 в 11:48
поделиться