模板类可以在 C++ 中有静态成员吗

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5827903/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 18:56:41  来源:igfitidea点击:

Can template classes have static members in C++

c++templatesstatic-members

提问by rubixibuc

Can a template class in C++ have static members? Since it doesn't exist and is imcomplete before it is used, is this possible?

C++ 中的模板类可以有静态成员吗​​?由于它不存在并且在使用之前是不完整的,这可能吗?

回答by Potatoswatter

Yes. The static member is declared or defined inside the template< … > class { … }block. If it is declared but not defined, then there must be another declaration which provides the definition of the member.

是的。静态成员在template< … > class { … }块内声明或定义。如果已声明但未定义,则必须有另一个声明提供成员的定义。

template< typename T >
class has_static {
    // inline method definition: provides the body of the function.
    static void meh() {}

    // method declaration: definition with the body must appear later
    static void fuh();

    // definition of a data member (i.e., declaration with initializer)
    // only allowed for const integral members
    static int const guh = 3;

    // declaration of data member, definition must appear later,
    // even if there is no initializer.
    static float pud;
};

// provide definitions for items not defined in class{}
// these still go in the header file

// this function is also inline, because it is a template
template< typename T >
void has_static<T>::fuh() {}

/* The only way to templatize a (non-function) object is to make it a static
   data member of a class. This declaration takes the form of a template yet
   defines a global variable, which is a bit special. */
template< typename T >
float has_static<T>::pud = 1.5f; // initializer is optional

A separate static member is created for each parameterization of the template. It is not possible to have a single member shared across allclasses generated by the template. For that, you must define another object outside the template. A partially-specialized traits class might help with that.

为模板的每个参数化创建一个单独的静态成员。不可能在模板生成的所有类之间共享单个成员。为此,您必须在模板之外定义另一个对象。部分专门化的特征类可能会对此有所帮助。