http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53493
jwatte at gmail dot com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |UNCONFIRMED Resolution|INVALID | --- Comment #5 from jwatte at gmail dot com 2012-05-26 20:22:55 UTC --- "it has to be the same in each translational unit that it is used" That doesn't mean it has to be /deleted/. An argument can be made that deleting it from the compilation unit is not very useful. If I remember correctly, the source of vague linkage was for allowing for the merging of inline template instantiations (rather than explicitly. Anyway, including the forward declaration in the definition translation unit as well as the using translation unit does make it work, so it works around this problem. Whether the behavior is useful or correct, I don't want to enter into an argument about.