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

时间:2015-05-29 13:02:55

标签: c++ templates explicit-specialization

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

:after

在Writer的源文件中,我为.leftPanel:after, .rightPanel:after { content: ""; background-size: cover; background-repeat: no-repeat; opacity: 0; top: 0; left: 0; bottom: 0; right: 0; position: absolute; transition: 1s; } .leftPanel:after{ background-image: url("http://www.soundtrackgeek.com/_WebThemes/pixelation/assets/images/fancybox/fancybox-overlay.png"); } .rightPanel:after{ background-image: url(http://2.bp.blogspot.com/-7ddmFBemMJY/UZy726LC2LI/AAAAAAAAC7w/WcwIHoWSSRU/s1600/hex-grid-overlay.png); } .leftPanel:hover:after, .rightPanel:hover:after { opacity: 1; } .texts{ position: relative; z-index: 1; } 添加了明确的特化:

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

这有效......有时候。即使我确定我有合适的类型:

some_type

有时会调用显式特化,有时会调用主要特征。是什么给了什么?

1 个答案:

答案 0 :(得分:11)

在源文件中声明特化并可能导致各种难以诊断的细微问题。编译器也没有义务在这里帮助您。在[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)
{ /* ... */ }

你也可以在标题中声明它(不再需要内联),并且仍然在源代码中定义它。