That's a different story. What we have is _equivalent_ explicit specialization, like
template<typename T> class bar { static void* data; };
template<typename T> bar<T>::data = 0;
struct baz { };
// in a different translation unit:
template<> bar<baz>::data = 0;
So there should be no any difference. But... Apparently compiler generates different code:
The difference is that the former definition is a template, and thus symbols created by its instantiations are given weak-extern linkage, i.e.
I should qualify that as *implicit* instantiations. Explicit instantiations might be non-weak, IIRC -- explicit and redundant instantiations will resut in 'multiply-defined' link diagnostics.
there may be multiple instantiations in different translation units, the linker will just pick any one for reference resolution purposes. The latter (full specialization) is no longer a template and given non-weak-external linkage. (Enforcing the ODR is one way to avoid this problem.) Hence, you see different linkage classifications shown by nm. Someone correct me if I'm wrong.
Fang David Fang Computer Systems Laboratory Electrical & Computer Engineering Cornell University http://www.csl.cornell.edu/~fang/ -- (2400 baud? Netscape 3.0?? lynx??? No problem!)