我有这个代码:
#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
是不同的对象等等。这就是为什么你需要指定你的意思。
为了确保所有Test
专业化之间只有一个member
的共享副本,您可以将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?
您可以给Test
一个默认值作为模板参数,如
template <typename T = void>
class Test {
然后你可以访问像这样的会员
std::cout << Test<>::member;
但CCD_ 14在肠道内是无法清除的。