我写了一个这样的模板专业化类:
template <> class MEField<SField> {....};
我想知道如何对这个类进行实例化?我看到一些代码是这样写的:MEField<> obj
?那正确吗?
我知道在函数专门化的情况下,我可以正常进行实例化,因为编译器可以判断参数的特殊类型。但至于课堂,你能告诉我真正的格式吗?
您通常像其他模板一样执行此操作,MEField<SField> obj;
. 无论您是否专门化了模板,该类的用户都不会受到打扰,由编译器决定使用哪个模板实例化。
这里,
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();
}
另请参阅:类模板的默认参数