3

我有一个模板化的类,想从它外部访问一个公共静态变量,但如果不实例化模板,我想不出任何方法。这段代码:

template<class T>
class TemplatedClass {
    public:
        static const int static_member = 10;
};

...

int i = TemplatedClass::static_member;

产生以下错误:“'template class TemplatedClass' used without template parameters.”

如果我在访问变量时实例化类:

int i = TemplatedClass<int>::static_member;

错误消失。我宁愿不必在使用虚拟类型参数并没有真正意义的上下文中实例化模板,只是为了抑制错误。如果必须,最好使用什么虚拟类型?我尝试了 <> 和 <void>,但都没有成功。

4

2 回答 2

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;

因此,编写清楚地表明您的意图的代码,即所有实例化的公共值不应该在依赖于类型的模板类中。如果您不能这样做,请更详细地解释您要执行的操作。

于 2013-02-13T05:46:23.960 回答
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不能是非整数类型。

Upd(感谢 jogojapan):这就是为什么在某些情况下您不能将任何类型用作虚拟类型

于 2013-02-13T05:54:23.150 回答