https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86491
--- Comment #3 from Jason Vas Dias <jason.vas.dias at gmail dot com> --- Of course, these lines of t2.h from Comment #1 : <quote> template < class _C_, _C_ *_C_OBJ_, void (_C_::*_M_)() > class NT { static constexpr _C_ *c_ = _C_OBJ_; public: NT() { (c_->*_M_)(); </quote> could be replaced by: <quote> template < class _C_, _C_ *_C_OBJ_, void (_C_::*_M_)() > class NT { static constexpr _C_ *c_ = _C_OBJ_; public: NT() { (c_->*_M_)(); </quote> and the same problem would occur (-Wsubobject-linkage warning) . (the existence of the 'c_' static const copy of '_C_' is irrelevant. It is simply that any occurrence of, in file A: namespace N { template <class C, C *, (retval (C::*M())()> class T { ... /* something that uses C */} } and in file B : namespace N { namespace X { class Y { ... }; Y y; } class C : T< Y, &y, retval (&Y::a_Y_method) (,..) > {...}; } // end namespace N will trigger this bug. I am trying to figure out why, and how it can be avoided. I do not want to trigger C++'s special 'anonymous namespace object' processing in any way here, and I do not see why it is being triggered.