C++:如何在没有模板参数的情况下访问模板化类的静态成员
我有这个代码:
#include <iostream>
template <typename T>
class Test {
public:
// Some code...
static int member;
};
int main()
{
std::cout << Test::member;
}
这当然不起作用,因为倒数第二行缺少Test.
但由于member不依赖于T,我想在不提供模板参数的情况下使其可访问。
有什么方法可以做到吗?
回答
如果您在类模板中声明一个静态成员Test,那么每个特化(即从Test模板生成的具体类型)都有一个单独的静态成员副本。也就是说,Test<int>::member是一个不同的对象Test<char>::member等等。这就是为什么您需要指定您指的是哪一个。
为确保member所有特化之间只有一个shared副本Test,您可以移动member到非模板基类:
struct TestBase {
static int member;
}
template <typename T>
class Test : public TestBase {
// ...
};
int main() {
// do something with TestBase::member
}
回答
没有一个,而是许多名为member. Test::member指的是哪一个?没有意义,所以不允许。
Test<int>::member = 42;
Test<short>::member = 13;
std::cout << Test::member << 'n'; // what should this print?