嵌套在模板化外部 class 内部的非模板化结构如何访问外部 class 的静态成员?

How can the non-templated struct nested inside of a templated outer class access static members of the outer class?

我发誓我已经在整个互联网上搜索过这个确切的问题,但找不到任何解决方案。

设置如下:

template <typename T>
class Foo {
  static bool bar;

public:
  struct Baz {
    void quux() {
      // I want to access bar here
    }
  };
  // friend typename struct Foo<T>::Baz;
  // The above works, but I'm not sure if it's what I need?
};

我想做的事情可行吗?

"Is what I'm trying to do possible?"

不,通过作用域或继承,它们仍然是独立的(尽管嵌套)和不相关的 classes。

// friend typename struct Foo<T>::Baz;
// The above works, but I'm not sure if it's what I need?

我也不太确定这是否是您真正需要的,但是由于 Baz 是在 Foo<T>private 部分中声明的,您无法访问它,除非提供 friend class 声明(内部 class 似乎是一个不错的选择),或使 const 成员 public.

访问没有问题,在Baz中使用Foo<T>::bar即可。我认为更大的问题是您需要为 Foo<T>::bar 分配存储空间。这意味着在您的 Foo.cpp 文件中,您必须实际实例化您可能想到使用的所有模板。例如:

template <typename T>
class Foo {
  static bool bar;
public:
  struct Baz {
    void quux() {
      // I want to access bar here
        Foo<T>::bar = true;
    }
  };
  static bool getBar() { return bar; }
};

// allocating storage for bars
template<>
bool Foo<int>::bar = false;
template<>
bool Foo<double>::bar = false;

int main() {
    Foo<int> fint;
    Foo<double> fouble;
    cout << Foo<int>::getBar() << " " << Foo<double>::getBar() << '\n';
    Foo<int>::Baz baz;
    baz.quux(); // alter int bar
    cout << Foo<int>::getBar() << " " << Foo<double>::getBar() << '\n';
}

Live demo