类模板成员模板的成员模板的显式模板函数专用化有效吗

Is this explicit template function specialization of a member template of a member template of a class template valid?

本文关键字:成员 有效 专用 函数      更新时间:2023-10-16

有人知道这种显式专门化是有效的还是无效的吗:

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(2013年3月12日)给出以下错误:
f: 。。。\test.cpp:36:20:error:没有定义的类"O"中"Fun"的定义越界

void L<int>::O<T>::Fun(U) {}
     ~~~~~~~~~~~~~~^

生成1个错误。

任何来自该标准的证明你的答案的参考资料都将不胜感激!

注意:我有点惊讶,这是一个错误-我希望为任何从<int><?any><?any>. 开始实例化"Fun"的模板参数族选择专门化

这是一个叮当作响的bug还是我期望中的bug?

谢谢!

======编辑(我想我有答案了)===

好的-我想我找到了支持性的措辞-来自N3797(芝加哥后2013年工作草案)-14.73/16=>

在类模板的成员或出现在命名空间作用域中的成员模板的显式专用化声明中,成员模板及其某些封闭类模板可能保持非专用化,但如果其封闭类模板也未显式专用,则声明不应显式专用类成员模板。

如果我正确地解释了这一点,我们需要O的显式专门化,如果我们要声明它的成员的显式专业化?因此出现了错误。

正确吗?

谢谢!

我认为这是无效的。我对该语言的理解还不够深入,无法告诉你如何/是否可以在不提供以下顶级专业化的情况下做到这一点,或者是否有跳过复制模板的快捷方式,但错误消息相当清楚:你试图提供依赖嵌套类型的静态成员的实现,而不提供实际依赖的专业化。即,这项工作:

#include <iostream>
template <typename>
struct L
{
    template <typename T>
    struct O
    {
        template <typename U>
        static void Fun(U)
        {
            std::cout << "General: " << __PRETTY_FUNCTION__ << std::endl;
        };
    };
};
// provide specialized L
template<>
struct L<int>
{
    template <typename T>
    struct O
    {
        template <typename U>
        static void Fun(U);
    };
};
// L<int> is a specialized type, so provide the rest.
template<typename T>
template<typename U>
void L<int>::O<T>::Fun(U)
{
    std::cout << "Special: " << __PRETTY_FUNCTION__ << std::endl;
}

int main()
{
    L<int>::O<double> nobj;
    nobj.Fun(10);
    L<double>::O<int> nobj2;
    nobj2.Fun(20);
    return 0;
}

输出

Special: static void L<int>::O<double>::Fun(U) [T = double, U = int]
General: static void L<double>::O<int>::Fun(U) [T = int, U = int]