C++ 与C+中的模板类混淆+;

C++ 与C+中的模板类混淆+;,c++,class,templates,C++,Class,Templates,我知道模板类定义如下: template <class TYPE> class cars{ public: TYPE myCar; } 模板 高级轿车{ 公众: myCar型; } 但我在某个地方遇到了这段代码: template <class T> class polynomialT { ... } ************************************** class GFNUM2m { ... } *********

我知道模板类定义如下:

template <class TYPE>
class cars{
   public:
   TYPE myCar;
}
模板
高级轿车{
公众:
myCar型;
}
但我在某个地方遇到了这段代码:

template <class T>
class polynomialT {

    ...

}
************************************** 
class GFNUM2m {

...
}
**************************************
template class polynomialT<GFNUM2m>;
模板
类多项式{
...
}
************************************** 
GFNUM2m类{
...
}
**************************************
模板类多项式;

最后一行对我来说很模糊?有人知道怎么回事吗?它是polynomialT类的对象吗?(似乎不是因为它没有名字)它是模板吗?(似乎是重复的,因为它已经被模板化过一次)

最后一行相当于:

class polynomialT {
  protected:
  GFNUM2m *coeff;                   // array of coefficients (? see below)
  int degree;
  ...

}

GFNUM2m*coeff
不是数组,只是指向
GFNUM2m
变量的指针。数组和指针是以某种方式链接的,例如,您可以使用
coeff=new GFNUM2m[10]
动态分配数组,但不建议这样做。

这意味着类polynomialT中的模板现在是GFNUM2m类。

模板类polynomialT;
template class polynomialT<GFNUM2m>;
是使用
GFNUM2m
显式实例化模板类
polynomialT
,包括实例化其所有非模板函数的请求

需要这样做的一些情况包括:

  • 当您想要避免多个模板实例化(然后被链接器清除)时
  • 当您希望确保即使对于那些未调用的(非模板)函数也可以实例化完整模板时
  • 当您希望在.cpp文件中提供模板定义时
最后一行是
多项式ALT
类模板的前向声明,模板参数为
GFNUM2m
,它也实例化了模板类。

事实上,它是显式模板实例化。使用此选项可使编译器生成模板类的所有(非嵌套模板)成员。有时在外部链接到模板化代码时,这很方便,以防止目标代码的重复或缺少外部(当方法内联时)

模板专门化看起来类似,但需要
Template
来宣布已声明模板的专门化。此外,它们还将为该特定模板参数定义一个替代类定义(正如@rerun提到的)

现在,在这些的交叉点上,你可以看到

template<> class polynomialT<GFNUM2m>;
模板类多项式alt;

实际上,这是一个前向声明的模板专门化。这将有助于防止编译器在翻译单元的其余部分自动实例化该类型参数的类模板。

是的,但更像是在动态分配数组后使用的类型的前向声明,这在某些情况下是绝对必要的。。。只有在不必要的时候才气馁。对不起?这对我来说甚至更模糊。我的意思是,这是对polynomialT的模板数据成员的正向减容。所以我们可以创建一个多项式对象,它有一个GFNUM2m的实例。很抱歉,这是不准确的。转发声明的全部思想是命名一个不完整的类型。在本例中,它只是实例化了一个完整的类型(来自clas模板)-1@SethCarnegie:当您想要避免多个模板实例化(然后被链接器清除)时;当您希望确保即使对于那些未调用的函数,也可以实例化完整模板时;当您希望在.cpp文件中提供模板定义时;可能还有其他一些情况……这可能非常有用,我很惊讶我以前从未遇到过。模板专门化在
模板之后有
@K-ballo:嘿,我想我从混乱中得到了一些有用的额外信息。谢谢