我有一个具有成员模板功能的类:
: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
有时会调用显式特化,有时会调用主要特征。是什么给了什么?
答案 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)
{ /* ... */ }
你也可以在标题中声明它(不再需要内联),并且仍然在源代码中定义它。