【问题标题】:C++: How to acces static member of templated class without template argumentsC++:如何在没有模板参数的情况下访问模板类的静态成员
【发布时间】:2021-08-30 15:11:15
【问题描述】:

我有这个代码:

#include <iostream>

template <typename T>
class Test {
public:

    // Some code...

    static int member;
};

int main()
{
    std::cout << Test::member;
}

这当然行不通,因为倒数第二行缺少Test 的模板参数。
但由于member 不依赖于T,我希望在不提供模板参数的情况下使其可访问。

有什么办法吗?

【问题讨论】:

  • 移出模板类
  • 你的意思是全局变量@MooingDuck?
  • 或者进入非模板TestHelper类。
  • Test&lt;int&gt;::memberTest&lt;float&gt;::member 是两个不同的对象。每个都有自己的member,但Test&lt;int&gt;Test&lt;float&gt;是两个不同的类。

标签: c++ class templates static


【解决方案1】:

如果您在类模板Test 中声明一个静态成员,那么每个特化(Test 模板生成的具体类型)都有一个静态成员的单独副本。也就是说,Test&lt;int&gt;::member 是与Test&lt;char&gt;::member 不同的对象,依此类推。这就是为什么您需要指定您的意思。

为确保在所有Test 特化之间共享一个member 副本,您可以将member 移动到非模板基类中:

struct TestBase {
    static int member;
}

template <typename T>
class Test : public TestBase {
    // ...
};

int main() {
    // do something with TestBase::member
}

【讨论】:

    【解决方案2】:

    命名为member 的静态变量不是一个,而是很多。 Test::member 指的是哪一个?没有意义,所以不允许。

    Test<int>::member = 42;
    Test<short>::member = 13;
    
    std::cout << Test::member << '\n';  // what should this print?
    

    【讨论】:

      【解决方案3】:

      你可以给Test一个模板参数的默认值,比如

      template <typename T = void>
      class Test {
      

      然后你会像这样访问成员

      std::cout << Test<>::member;
      

      但你无法彻底摆脱&lt;&gt;

      【讨论】:

      • 如果Test 的成员函数提及member,这将导致混淆,因为提及总是必须用Test&lt;&gt;:: 限定;名称的普通提及将引用当前实例化的member
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      相关资源
      最近更新 更多