Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

template specialization in another file c++. Which version gets

I have these files :-

1.h :-

#include <iostream>

using namespace std;

template <typename A>
void f() {
  cout<<"generic\n";
}

1.cpp :-

#include "1.h"

template <>
void f<int> () {
  cout<<"for ints only\n";
}

main.cpp :-

#include "1.h"

int main() {
  f<int>();
  return 0;
}

Now, I compile and run these with g++ like this :-

g++ -c 1.cpp -o 1.o 
g++ main.cpp 1.o
./a.out

And I get :-

for ints only

On the other hand, I compile it with icpc like this :-

icpc -c 1.cpp -o 1.o
icpc main.cpp 1.o
./a.out

And I get :-

generic

What does the C++ standard say about this? Is any one compiler "right" and the other "wrong" or is the standard ambiguous on this issue and both are "right" ?

like image 471
owagh Avatar asked Jun 21 '12 19:06

owagh


1 Answers

Your program exhibits undefined behavior. The specialization must be declared in every translation unit in which it is used, per C++11 §14.7.3/6:

If a template, a member template or a member of a class template is explicitly specialized then that specialization shall be declared before the first use of that specialization that would cause an implicit instantiation to take place, in every translation unit in which such a use occurs; no diagnostic is required.

like image 76
James McNellis Avatar answered Sep 21 '22 16:09

James McNellis