What should happen to template class static member variables with definition in the .h file

前端 未结 3 479
星月不相逢
星月不相逢 2020-12-09 05:24

If a template class definition contains a static member variable that depends on the template type, I\'m unsure of what the reliable behavior should be?

In my case i

3条回答
  •  Happy的楠姐
    2020-12-09 06:09

    This is wholly an addition to @Kerrek SB's excellent answer. I'd add it as a comment, but there're many of them already, so the new comments are hidden by default.

    So, his and other examples I saw are "easy" in the sense that type of static member variable is known beforehand. It's easy because compiler for example knows storage size for any template instantiation, so one may think that compiler could use funky mangling scheme, output variable definition once, and offload the rest to linker, and that might even work.

    But it's a bit amazing that that it works when static member type depends on template parameter. For example, following works:

    template 
    class Ticks : public ITimer< width, Ticks >
    {
    protected:
        volatile static width ticks;
    }
    template  volatile width Ticks::ticks;
    

    (Note that explicit instantiation of static var doesn't need (or allows) default spec for "width").

    So, it brings more thoughts, that C++ compiler has to do quite a lot of processing - in particular, to instantiate a template, not only a template itself is needed, but it must also collect all [static member] explicit instantiations (one may only wonder then why they were made separate syntactic constructs, not something to be spelled out within the template class).

    As for implementation of this on linker level, for GNU binutils its "common symbols": http://sourceware.org/binutils/docs/as/Comm.html#Comm . (For Microsoft toolchains, it's named COMDAT, as another answer says).

提交回复
热议问题