类模板实例化

不同于函数模板,在实例化类模板时,您必须通过为类模板提供参数来显式实例化类。 创建 TempClass 的实例:

TempClass< float, 6 > test1;       // OK
TempClass< char, items++ > test2;  // Error, second parameter 
                                   // must be constant.

编译器在实例化类或函数时为模板类或函数生成代码。 成员函数在调用时初始化,而虚拟成员函数在构造其类时实例化。 如果要使用其他用户的模板构建库,那么这会导致问题。 有关详细信息,请参阅显式实例化

类模板由编译器首先专用化,然后实例化。 编译器不会实例化类模板,除非执行了对此模板类的成员的引用、在类上使用了 sizeof 或创建了实例。

模板的显式专用化是特定类型的模板的自定义版本。

// template_instantiation2.cpp
template<class T> class X
{
};

// Explicit specialization of X with 'int'
template<> class X<int>
{
};
int main()
{
}

没有 template<> 的显式专用化将生成错误。 Visual C++ .NET 2003 之前的 Visual C++ 版本接受此语法:

// Explicit specialization of X with 'char'
class X<char> // C2906
{
};

如果已显式实例化或专用化某个模板一次,则不能在同一组模板参数的同一程序中显式实例化或专用化该模板第二次。 允许使用不同模板参数进行进一步专用化。

如果没有特定模板参数的显式实例化或专用化,则将在模板首次使用的位置对其进行隐式实例化。

由于同一模板的不同实例化是不同的类型,因此模板的一个规范或实例化的静态成员与同一模板的另一规范或实例化的静态成员相互独立。

请参见

参考

类模板