我有一个模板化的类,并希望从外部访问一个公共静态变量,但是如果没有实例化模板,我无法想出任何方法。这段代码:
template<class T>
class TemplatedClass {
public:
static const int static_member = 10;
};
...
int i = TemplatedClass::static_member;
产生以下错误:“'模板类TemplatedClass'在没有模板参数的情况下使用。”
如果我在访问变量时实例化该类:
int i = TemplatedClass<int>::static_member;
错误消失了。我宁愿不必在一个上下文中实例化一个模板,它只是为了抑制错误而使用虚拟类型参数没有意义。如果必须的话,最好使用哪种假型?我试过&lt;&gt;和&lt; void&gt;,但都没有用。
答案 0 :(得分:4)
无法完成,因为专业化可能会覆盖该值,即:
template<class T>
class TemplatedClass : public BaseClass
{
static const int value = 42;
};
template<>
class TemplatedClass<StarTrek>
{
static const int value = 47;
}
因此,您将得到不同的值:
TemplatedClass<StarTrek>::value != TemplatedClass<void>::value
如果值相等,我强烈建议您添加非模板基类:
class BaseClass {
public:
static const int value = 42;
};
template<class T>
class TemplatedClass : public BaseClass
{
...
}
实例化或显式虚拟类型(即void)可能有效,但根据您使用模板参数的方式,可能会出现编译错误。
int x = TemplatedClass<void>::value;
所以,请编写清楚显示您的意图的代码,即所有实例化的常见值不应该在依赖于类型的模板类中。如果你不能那样做,请详细解释你想要做的事情。
答案 1 :(得分:2)
使用虚拟类型可能适用于琐碎的类,但如果事情变得更复杂则不行。
让我们想象一下,你的班级“继续”这样:
template<class T>
class TemplatedClass {
public:
static const int static_member = 10;
typedef typename std::enable_if< std::is_integral< T >::value >::type type;
};
此代码告诉我们T 不能是非整数类型。
更新(感谢jogojapan): 这就是为什么在某些情况下你不能使用任何类型作为虚拟类型