Hi again,
template <> void* foo<void*>::data = &something_else;
which is similar to the original code in this thread. The instantiation of foo<void*>::data can now be different-valued. (Is this analogous to the GiNaC source or proposed patch in question?)
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. 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.
// With explicit specialization $ nm -B -C build/ginac/ginac/.libs/libginac.so | grep -e '::first' 0032bc8c B GiNaC::class_info<GiNaC::print_context_options>::first 0032bc84 B GiNaC::class_info<GiNaC::registered_class_options>::first
// _Without_ explicit specialization nm -B -C build/ginac/ginac/.libs/libginac.so | grep -e '::first' 002611d0 V GiNaC::class_info<GiNaC::print_context_options>::first 00261168 V GiNaC::class_info<GiNaC::registered_class_options>::first
I need to re-read the standard to understand what's going on...
It is not fun reading material. :) 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!)