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

时间:2015-08-25 19:44:10

标签: c++ templates nested-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?
};

我正在尝试做什么?

2 个答案:

答案 0 :(得分:2)

访问不是问题,只需在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

答案 1 :(得分:1)

  

“我正在尝试做什么?”

不,通过范围或继承,这些仍然是独立的(虽然是嵌套的)和不相关的类。

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

我也不确定这是否是您真正需要的,但是由于Bazprivate的{​​{1}}部分声明,因此您无法访问它,除非提供Foo<T>类声明(内部类似乎是一个不错的选择),或者使friend成员const