2

我写了一个这样的模板专业化类:

template <> class MEField<SField> {....};

我想知道如何对这个类进行实例化?我看到一些代码是这样写的:MEField<> obj?那正确吗?

我知道在函数专门化的情况下,我可以正常进行实例化,因为编译器可以判断参数的特殊类型。但至于课堂,你能告诉我真正的格式吗?

4

2 回答 2

3

您通常像其他模板一样执行此操作,MEField<SField> obj;. 无论您是否专门化了模板,该类的用户都不会受到打扰,由编译器决定使用哪个模板实例化。

于 2012-07-09T03:19:26.647 回答
1

这里,

template <> class MEField<SField> {....};

你所做的是明确的专业化。正如msdn所说,

当类或函数被实例化时,编译器会为模板类或函数生成代码。

它进一步指出,

如果模板被显式实例化或特化一次,则不能在同一程序中为同一组模板参数显式实例化或特化第二次。允许使用不同模板参数的进一步特化。

所以标准的方式就是这样写。

MEField<SField> obj;

但是,正如 Jesse Good 所说,您可以使用默认模板参数,在实例化时不需要您指定类型,因为它使用您指定的默认类型。

请参阅下面的代码(测试代码)

class SField
{
public:
    int m_var;
    SField():m_var(0){}
};

template<typename T = SField> // Default template argument.
class MEField
{
public:
   T m_var;
};

template <>
class MEField<SField> // Explicit specialization
{
public:
   SField sField;
   void print(){ cout << sField.m_var; }
};

int main()
{
    MEField<> obj;
    obj.print();
}

另请参阅:类模板的默认参数

于 2012-07-09T03:50:11.317 回答