【问题标题】: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 应该等于什么?

标签: c++ templates inheritance


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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


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

    【讨论】:

    • 您可以使用CTemplateClass&lt;void&gt;::some_data
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多