http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57746

--- Comment #4 from Andy Lutomirski <luto at mit dot edu> ---
Daniel, I'm unconvinced that your interpretation is the intended one. 
[temp.explicit].4 says "A declaration of [list including member function] ... A
definition of [list not including member function]".  If definitions were
intended to be declarations in this context, then the second part would be
redundant, I think.

Regardless, the interesting case is:

template<typename T>
struct X
{
  static int val;
  static void func();
};

// optionally: extern template struct X<int>;

void something()
{
  X<int>::func();
}

in one file and

struct X
{
  static int val;
  static void func();
};

template<> void X<int>::func() {}

in another.  I don't think this is an odr violation, since there is only one
definition of anything that could be confused with X<int>::func.  g++ will
happily compile and link it (without the extern template bit) and it will work.
 It is supposed to?  Could a conforming compiler mangle the specialized version
of func differently?

Reply via email to