源文件中成员函数模板的显式专业化

巴里

我有一个带有成员模板功能的类:

// writer.h
class Writer {
public:
    ...
    template <typename T, typename V>
    void addField(const std::string& name, V v) 
    {
        // write something
    }
};

在Writer的源文件中,我为some_type以下项添加了显式的专业化

// writer.cpp
template <>
void Writer::addField<some_type, int>(const std::string& name, int v)
{
    // specific some_type writing logic
}

这有时...有效。即使我绝对确保我拥有正确的类型:

writer.addField<some_type>("name", static_cast<int>(some_value));

有时调用显式专业化,有时调用主专业。是什么赋予了?

巴里

在源文件中声明专业化可能会导致各种难以诊断的细微问题。编译器也没有义务在任何方面为您提供帮助。该标准强烈建议您不要在[temp.expl.spec] / 6-7的打油诗的帮助下执行此操作

如果一个模板,一个成员模板或一个类模板的成员被明确地专门化,则应在首次使用该专门化之前声明该专门化,这将在发生这种使用的每个翻译单元中引起隐式实例化; 无需诊断如果程序未提供显式专门化的定义,并且以某种方式使用专门化会导致隐式实例化,或者该成员是虚拟成员函数,则该程序格式错误,无需诊断。对于已声明但未定义的显式专门化,永远不会生成隐式实例化。

函数模板,类模板,变量模板,类模板的成员函数等的显式专门化声明的位置,会根据显式专门化声明的相对位置来影响程序是否格式正确以及上面和下面指定的在翻译单元中的实例化点。编写专长时,请注意其位置;或使其编译将是一场点燃其自焚的审判

在某些翻译单位中,有可能恰好在第一次使用之前就宣布了专业化,而在某些翻译单位中却没有。最好完全通过在标头中声明您的专长来完全避免所有这些问题:

// writer.h
class Writer {
public:
    ...
    template <typename T, typename V>
    void addField(const std::string& name, V v) 
    { /* ... */ }
};

// still writer.h
template <>
inline void Writer::addField<some_type, int>(const std::string& name, int v)
{ /* ... */ }

您也可以只在标头中声明它(不再需要内联),而仍在源代码中定义它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数模板C ++的显式专业化

来自分类Dev

函数模板的显式专业化声明中的尾随模板参数推导(无函数参数推导)

来自分类Dev

可变参数模板成员函数的部分专业化

来自分类Dev

专业化可变参数模板成员函数

来自分类Dev

C ++模板显式专业化-调用现有成员函数

来自分类Dev

将模板成员函数的专业化定义(没有默认主体)放在源文件中是否安全?

来自分类Dev

功能模板显式专业化

来自分类Dev

显式模板专业化错误

来自分类Dev

模板变量的显式专业化

来自分类Dev

C ++显式专业化不能访问primay模板成员,但是可以访问部分专业化成员?

来自分类Dev

在源文件中放置模板成员函数的专业化定义(没有默认主体)是否安全?

来自分类Dev

C ++中模板类的成员函数的专业化

来自分类Dev

模板专业化-成员函数

来自分类Dev

模板专业化-成员函数

来自分类Dev

模板类成员函数的专业化

来自分类Dev

模板类的模板构造函数的显式模板专业化

来自分类Dev

模板类的模板构造函数的显式模板专业化

来自分类Dev

基于部分模板-模板的专业化与显式部分模板的专业化

来自分类Dev

完全专业化的类模板的功能模板的显式专业化

来自分类Dev

C ++构造函数模板专业化

来自分类Dev

类模板中嵌套类模板的显式专业化

来自分类Dev

带有重载的显式模板函数专业化:为什么要这样做?

来自分类Dev

G ++中的显式模板专业化会引起麻烦

来自分类Dev

(特别是显式)专业化中的模板参数列表的访问检查规则

来自分类Dev

如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?

来自分类Dev

模板类成员函数的C ++部分专业化

来自分类Dev

源文件中的C ++部分专业化

来自分类Dev

类模板的可变构造函数模板的专业化

来自分类Dev

类模板成员专业化

Related 相关文章

  1. 1

    函数模板C ++的显式专业化

  2. 2

    函数模板的显式专业化声明中的尾随模板参数推导(无函数参数推导)

  3. 3

    可变参数模板成员函数的部分专业化

  4. 4

    专业化可变参数模板成员函数

  5. 5

    C ++模板显式专业化-调用现有成员函数

  6. 6

    将模板成员函数的专业化定义(没有默认主体)放在源文件中是否安全?

  7. 7

    功能模板显式专业化

  8. 8

    显式模板专业化错误

  9. 9

    模板变量的显式专业化

  10. 10

    C ++显式专业化不能访问primay模板成员,但是可以访问部分专业化成员?

  11. 11

    在源文件中放置模板成员函数的专业化定义(没有默认主体)是否安全?

  12. 12

    C ++中模板类的成员函数的专业化

  13. 13

    模板专业化-成员函数

  14. 14

    模板专业化-成员函数

  15. 15

    模板类成员函数的专业化

  16. 16

    模板类的模板构造函数的显式模板专业化

  17. 17

    模板类的模板构造函数的显式模板专业化

  18. 18

    基于部分模板-模板的专业化与显式部分模板的专业化

  19. 19

    完全专业化的类模板的功能模板的显式专业化

  20. 20

    C ++构造函数模板专业化

  21. 21

    类模板中嵌套类模板的显式专业化

  22. 22

    带有重载的显式模板函数专业化:为什么要这样做?

  23. 23

    G ++中的显式模板专业化会引起麻烦

  24. 24

    (特别是显式)专业化中的模板参数列表的访问检查规则

  25. 25

    如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?

  26. 26

    模板类成员函数的C ++部分专业化

  27. 27

    源文件中的C ++部分专业化

  28. 28

    类模板的可变构造函数模板的专业化

  29. 29

    类模板成员专业化

热门标签

归档