如果有这样一个模板:
对于以下若干种定义方式,哪些是对的(通过编译)?
为了不影响大家分析判断,我把答案颜色调成比较浅的颜色,下面即是答案:
首先,说明一下三个正确的答案。
第一种形式称之为特化定义,其作用是为模板某一特化提供其静态成员的定义,在我们例子中,它仅仅为Test
第 二种形式类似于普通类的静态成员的定义方式,其作用是隐式地在该编译单元为模板的所有特化提供其静态成员的定义,在我们例子中,在首次使用 Test
第三种形式和第二种形式一致,唯一不同就是采用默认构造函数初始化。
其次,说明一下三个错误的答案。
第一种形式,很多人都会认为是对的,认为它采用默认构造函数初始化。但编译器会对特化定义进行特殊处理,编译认为它是一个声明而非定义。至于为什么如此,应该询问一下制定标准的人。我认为可能实现这样的语法可能比较困难并且这个语法也比较鸡肋。
第二种形式,这不成了声明一个函数啦。
第三种形式,同第二种。
两种正确的定义方式还有哪些其他的区别呢?
这两个定义可以在不同的编译单元共存,Test
而特化定义,上述方式无法通过编译。
上述方式无法通过编译。
一般为了避免无法编译,应当尽量减少使用,如下方式的定义
template string Test::info;
只有在你首次需要使用时在实现文件中给出如下特化定义即可,其他文件只要包含头文件就能使用。
template <> string Test::info("123");
Original: https://www.cnblogs.com/wlzy/p/10927343.html
Author: ZYVV
Title: [转]C++ 模板 静态成员 定义(实例化)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535102/
转载文章受原作者版权保护。转载请注明原作者出处!