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