Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型为&;的模板类中类型参数的部分专门化;模板参数_C++_Templates_Partial Specialization_Template Templates - Fatal编程技术网

C++ 类型为&;的模板类中类型参数的部分专门化;模板参数

C++ 类型为&;的模板类中类型参数的部分专门化;模板参数,c++,templates,partial-specialization,template-templates,C++,Templates,Partial Specialization,Template Templates,我想专门化以下模板类的类型参数,它有一个类型参数和一个模板参数: template < typename T, template <typename E> class Foo > class Bar; (二) 模板< 模板类Foo >分类栏; (三) 模板< 模板类Foo >分类栏; (四) 模板< 模板类Foo 分类栏; 为什么它们都不起作用 关于每个适用代码段的最后一行: typename是否澄清E是类Foo使用的类型,或者此语法只能在Bar

我想专门化以下模板类的类型参数,它有一个类型参数和一个模板参数:

template <
    typename T,
    template <typename E> class Foo
> class Bar;
(二)

模板<
模板类Foo
>分类栏;
(三)

模板<
模板类Foo
>分类栏;
(四)

模板<
模板类Foo
分类栏;
为什么它们都不起作用

关于每个适用代码段的最后一行:

  • typename
    是否澄清
    E
    是类
    Foo
    使用的类型,或者此语法只能在
    Bar
    的类定义的
    {}
    主体中使用
  • template
    澄清
    Foo
    是一个模板,因此阻止编译器像这样解析
    Foo:

    template <template <typename E> class Foo>
    class Bar<int, Foo>
    {
        // ...
    };
    
    模板
    分类栏
    {
    // ...
    };
    
    您甚至可以省略内部参数名称
    E
    ,因为它没有任何用途。

    如下所示:

    template <template <typename E> class Foo>
    class Bar<int, Foo>
    {
        // ...
    };
    
    模板
    分类栏
    {
    // ...
    };
    
    您甚至可以省略内部参数名称
    E
    ,因为它没有任何用途

    typename
    是否澄清
    E
    是类
    Foo
    使用的类型,或者此语法只能在
    Bar
    的类定义的
    {}
    主体中使用

    typename
    仅在模板定义中定义类型(也可以使用
    class
    )或访问依赖类型(依赖于模板参数的类型)时使用

    有关更多信息(甚至关于何时使用
    模板
    ),请参阅

    我怎样才能让它工作

    模板参数内类型的名称实际上无法使用。这只是一种形式。您必须将另一个模板参数添加到主模板:

    模板<
    模板类Foo,
    类型名E
    >类条{…};
    
    此外,如果这是模板
    Bar
    的专门化,则
    Bar
    需要一个主模板来专门化:

    template<typename T, typename U>
    struct Bar;
    
    template <
        template<typename> class Foo,
        typename E
    > class Bar<int, Foo<E>> { ... };
    
    模板
    结构杆;
    模板<
    模板类Foo,
    类型名E
    >类条{…};
    
    typename
    是否澄清
    E
    是类
    Foo
    使用的类型,或者此语法只能在
    Bar
    的类定义的
    {}
    主体中使用

    typename
    仅在模板定义中定义类型(也可以使用
    class
    )或访问依赖类型(依赖于模板参数的类型)时使用

    有关更多信息(甚至关于何时使用
    模板
    ),请参阅

    我怎样才能让它工作

    模板参数内类型的名称实际上无法使用。这只是一种形式。您必须将另一个模板参数添加到主模板:

    模板<
    模板类Foo,
    类型名E
    >类条{…};
    
    此外,如果这是模板
    Bar
    的专门化,则
    Bar
    需要一个主模板来专门化:

    template<typename T, typename U>
    struct Bar;
    
    template <
        template<typename> class Foo,
        typename E
    > class Bar<int, Foo<E>> { ... };
    
    模板
    结构杆;
    模板<
    模板类Foo,
    类型名E
    >类条{…};
    
    请给出一个完整的工作示例好吗?我遵循了你的建议,要么是我误解了它,要么就是它无法编译。我包括了另一个被注释掉的备选方案,它也无法编译。+1,这是我想首先解释的。@CodeBricks您的主模板不正确
    Foo
    是一种类型,因此主模板中的第二个参数也应该是@0x499602D2您的解决方案已编译!我的结论正确吗?主模板的类型参数
    E
    专用于两个参数:
    template class Foo
    typename E
    ?@CodeBricks否。模板参数
    E
    的名称是任意名称。事实上,由于该名称没有在主模板中的任何位置使用,因此可以将其删除,从而生成
    模板类栏。唯一正在发生的专门化是在第二个模板中,其中模板名称与
    Bar
    的主模板定义没有任何关系。唯一重要的是在专门化中如何配置类型。请给出一个完整的工作示例好吗?我遵循了你的建议,要么是我误解了它,要么就是它无法编译。我包括了另一个被注释掉的备选方案,它也无法编译。+1,这是我想首先解释的。@CodeBricks您的主模板不正确
    Foo
    是一种类型,因此主模板中的第二个参数也应该是@0x499602D2您的解决方案已编译!我的结论正确吗?主模板的类型参数
    E
    专用于两个参数:
    template class Foo
    typename E
    ?@CodeBricks否。模板参数
    E
    的名称是任意名称。事实上,由于该名称没有在主模板中的任何位置使用,因此可以将其删除,从而生成
    模板类栏。唯一正在发生的专门化是在第二个模板中,其中模板名称与
    Bar
    的主模板定义没有任何关系。唯一重要的是在专门化中如何配置类型。
    template <template <typename E> class Foo>
    class Bar<int, Foo>
    {
        // ...
    };
    
    template<typename T, typename U>
    struct Bar;
    
    template <
        template<typename> class Foo,
        typename E
    > class Bar<int, Foo<E>> { ... };