C++——多层嵌套模板类的静态成员变量的声明与定义方式

在 C++ 类的设计中,静态成员变量必须在类中声明,在类外定义,对于模板类亦是如此。
如果只是单层级的模板类,其声明方式参考如下代码:

template< typename upid_t >
class parent_t
{
private:
    static upid_t ms_auto_upid; ///< 静态成员变量

public:
    parent_t(void) : { m_upid = ms_auto_upid++; }
    ~parent_t(void) { }

    upid_t id(void) { return m_upid; }

protected:
    upid_t m_upid;
};

/** 静态成员变量的外部定义 */
template< typename upid_t >
upid_t parent_t< upid_t >::::ms_auto_upid = upid_t(100);

而针对多层级内嵌的模板类,其 静态成员变量外部定义 方式,我在网上未能搜到相关代码的写法,好在自己通过多次尝试也摸索出正确的代码定义写法,如下所示:


#include <iostream>

template< typename upid_t >
class parent_t
{
public:
    template< typename ucid_t >
    class child_t
    {
    private:
        static ucid_t ms_auto_ucid; ///< 静态成员变量

    public:
        child_t(void)   { m_ucid = ++ms_auto_ucid; }
        ~child_t(void)  { }

        ucid_t id(void) { return m_ucid; }
    private:
        ucid_t m_ucid;
    };

public:
    parent_t(upid_t upid) : m_upid(upid) { }
    ~parent_t(void) { }

    upid_t id(void) { return m_upid; }

protected:
    upid_t m_upid;
};

/** 多层嵌套模板类的静态成员变量的定义方式 */
template< typename upid_t >
template< typename ucid_t >
ucid_t parent_t< upid_t >::child_t< ucid_t >::ms_auto_ucid = ucid_t(100);

int main(int argc, char * argv[])
{
    parent_t< unsigned int >::child_t< int > xchild1;
    parent_t< unsigned int >::child_t< int > xchild2;
    parent_t< unsigned int >::child_t< size_t > xchild3;
    parent_t< unsigned int >::child_t< size_t > xchild4;

    std::cout << "child 1 : " << xchild1.id() << std::endl;
    std::cout << "child 2 : " << xchild2.id() << std::endl;
    std::cout << "child 3 : " << xchild3.id() << std::endl;
    std::cout << "child 4 : " << xchild4.id() << std::endl;

    return 0;
}

利用 https://godbolt.org 提供的在线编译环境,上面测试代码在多种编译器下编译通过,其输出结果均符合预期结果,即:

child 1 : 101
child 2 : 102
child 3 : 101
child 4 : 102
posted @ 2022-11-29 13:16  Gaaagaa  阅读(390)  评论(0编辑  收藏  举报