访问模板类的非模板库的静态数据
Posted
技术标签:
【中文标题】访问模板类的非模板库的静态数据【英文标题】:Access static data of non-template base of templated class 【发布时间】:2019-11-15 11:02:35 【问题描述】:模板类派生自具有静态数据成员的非模板类。为什么我不能在不指定模板参数的情况下访问它?实际上,我可以在没有模板参数的情况下访问模板类中的任何方法或数据吗?
class CNonTemplateBase
public:
static int some_data;
;
int CNonTemplateBase::some_data = 10;
template<typename T> class CTemplateClass : public CNonTemplateBase;
...
...
int a = CTemplateClass<int>::some_data; //OK
int b = CTemplateClass::some_data; //ERROR
【问题讨论】:
那么对于template<> class CTemplateClass<double> static constexpr int some_data = 20;
,b
应该等于什么?
【参考方案1】:
这是因为CTemplateClass
本身并不存在。模板类必须首先使用提供的模板参数生成。
【讨论】:
【参考方案2】:为什么我不能在不指定模板参数的情况下访问它?
因为可以编写CTemplateClass
,以便它仅针对模板参数的某些特定值从CNonTemplateBase
继承。
实际上,我可以在没有模板参数的情况下访问模板类中的任何方法或数据吗?
不,因为它们可能依赖于模板参数。
最后,这就是语言的工作原理。我认为可以更改语言以允许在某些条件下使用您想要的语法,但是如果没有充分的理由,它会使 C++ 变得更加复杂。
【讨论】:
您可以使用CTemplateClass<void>::some_data
。【参考方案3】:
编译器不会为没有实例化(类型)的模板类生成代码。因此,您不能访问实例化模板类的静态成员。
【讨论】:
以上是关于访问模板类的非模板库的静态数据的主要内容,如果未能解决你的问题,请参考以下文章
Makefile常用万能模板(包括静态链接库动态链接库可执行文件)