如何新建Template Specialization Class对象
How can I new a Template-Specialization Class object?
我编写了一个模板专业化类,如下所示:
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();
}
另请参阅:类模板的默认参数
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 传递给std::function template的template参数究竟代表什么
- 在template中使用std::variant的template函数
- C++ template for QList
- C++ - 为什么这里需要'template'关键字?
- 使用"std::enable_if_t" "function template has already been defined"
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- C++ class template
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么编译器说"candidate template ignored: couldn't infer template argument 'InputIterator'"?
- 为什么在这种情况下我需要 .template
- std::span constructor, libcxx vs libstdc++, template vs non-
- 模板函数参数到模板函数的"candidate template ignored: could not match ..."
- MacOS 上的 LLVM - 标准文件 iosfwd 中未知类型名称'template'
- std::get like (partial) template specialization
- 实现多类型算术运算符时如何解决"template argument deduction/substitution failure"
- 更新 Visual Studio 2017,现在出现编译错误 C7510:"回调":使用依赖模板名称必须以 'template' 为前缀
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- Template类定义中的Template方法与声明不匹配
- 为什么在template函数广播中把两个extensor表达式加在一起不正确