嵌套在模板化外部 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';
}
我发誓我已经在整个互联网上搜索过这个确切的问题,但找不到任何解决方案。
设置如下:
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';
}