访问模板类的非模板库的静态数据

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&lt;&gt; class CTemplateClass&lt;double&gt; static constexpr int some_data = 20; b 应该等于什么? 【参考方案1】:

这是因为CTemplateClass 本身并不存在。模板类必须首先使用提供的模板参数生成。

【讨论】:

【参考方案2】:

为什么我不能在不指定模板参数的情况下访问它?

因为可以编写CTemplateClass,以便它仅针对模板参数的某些特定值从CNonTemplateBase 继承。

实际上,我可以在没有模板参数的情况下访问模板类中的任何方法或数据吗?

不,因为它们可能依赖于模板参数。


最后,这就是语言的工作原理。我认为可以更改语言以允许在某些条件下使用您想要的语法,但是如果没有充分的理由,它会使 C++ 变得更加复杂。

【讨论】:

您可以使用CTemplateClass&lt;void&gt;::some_data【参考方案3】:

编译器不会为没有实例化(类型)的模板类生成代码。因此,您不能访问实例化模板类的静态成员。

【讨论】:

以上是关于访问模板类的非模板库的静态数据的主要内容,如果未能解决你的问题,请参考以下文章

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

Makefile常用万能模板(包括静态链接库动态链接库可执行文件)

使用类的非模板版本作为父级

创建和使用 MFC 静态库

makefile? 模板 (template)

MVC与vue2概要模板数据绑定与综合示例