有没有人知道这个显式特化是否有效:
template <class>
struct L {
template <typename T>
struct O {
template <typename U>
static void Fun(U);
};
};
template<>
template<typename T>
template<typename U>
void L<int>::O<T>::Fun(U) {}
clang trunk (12/3/2013) 出现以下错误:
f:...\test.cpp:36:20: 错误:类 'O' 中的 'Fun' 的外部定义没有定义
void L<int>::O<T>::Fun(U) {}
~~~~~~~~~~~~~~^
生成了1个错误。
如果您能提供标准中支持您答案的任何参考资料,将不胜感激!
注意:我有些惊讶这是一个错误——我希望对于任何以<int><?any><?any>
开头实例化'Fun'的模板参数族,都会选择专门化。
这是clang的bug还是我的期望有问题?
谢谢!
====== 编辑(我认为我有了答案)=======
好的,我想我找到了支持的措辞——来自N3797(芝加哥2013年工作草案后)-14.7.3/16 =>
"在类模板的成员或命名空间范围内出现的成员模板的显式专门化声明中,成员模板及其一些封闭类模板可以保持未专门化状态,除非声明不明确地专门化类成员模板,如果其封闭类模板也没有明确专门化,则其封闭类模板不得明确专门化。"
如果我理解正确,如果我们要声明其成员的显式专门化,就需要O的显式专门化吗?因此出现了错误。
正确吗?
谢谢!
L<X>::O<int>
。而L<int>::O<T>
则是可以的。 - M.ML<int>::O
的位置。 - M.M