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
C++ 使用类模板而不传递模板参数 //p1:一些值 //nt:本机类型 样板 结构A{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B1{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B2{}; //结核病:B的专门化? //tA:A的专门化 样板 结构C{}; //现在我想创建一个C部分专门化,其中: //A //B? 模板 结构C{}; int main() { CC; }_C++_Templates - Fatal编程技术网

C++ 使用类模板而不传递模板参数 //p1:一些值 //nt:本机类型 样板 结构A{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B1{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B2{}; //结核病:B的专门化? //tA:A的专门化 样板 结构C{}; //现在我想创建一个C部分专门化,其中: //A //B? 模板 结构C{}; int main() { CC; }

C++ 使用类模板而不传递模板参数 //p1:一些值 //nt:本机类型 样板 结构A{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B1{}; //pt:指向类型的指针,即int* //tA:a的一个专门化 样板 结构B2{}; //结核病:B的专门化? //tA:A的专门化 样板 结构C{}; //现在我想创建一个C部分专门化,其中: //A //B? 模板 结构C{}; int main() { CC; },c++,templates,C++,Templates,使用clang编译上述代码时,会出现以下错误: // p1: some value // nt: native type template<int p1, typename nt> struct A {}; // pt: pointer to type i.e. int* // tA: a specialization of A template<typename pt, typename tA> struct B1 {}; // pt: pointer to typ

使用clang编译上述代码时,会出现以下错误:

// p1: some value
// nt: native type
template<int p1, typename nt>
struct A {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B1 {};

// pt: pointer to type i.e. int*
// tA: a specialization of A
template<typename pt, typename tA>
struct B2 {};

// tB: specialization of B?
// tA: specialization of A
template<typename tB, typename tA>
struct C {};

// now i want to create a C partial specialization where:
//  A<some_value, native_type>
//  B?<char*, A<some_value, native_type> >

template< template<typename, typename> class B, int p1, typename nt >
struct C< B<char*, A<p1, nt> >, A<p1, nt> > {};

int main()
{
    C< B1, A<10, int> > c;
}
错误:使用类模板B1需要模板参数
CC;
^~
我理解错误,要修复它,应该是
B1
。编译器应该从最匹配的专门化中扣除这些参数的值吗

编译器应该从最匹配的专门化中扣除这些参数的值吗

我不确定我是否理解你的问题,但如果我理解,那么答案是“不”。编译器不知道如何从类模板的裸名称(
B1
,在本例中为
B1
)推断出完全实例化的类型。您必须为
B1
指定模板参数

请记住,主模板的专门化是在为主模板提供必要的参数之后选择的。在这种情况下,主模板接受两个类型参数,并且必须提供两个类型参数

在模板专用化中使用模板参数
B
,以匹配作为
B
实例的类型参数,这一事实不会改变主模板的参数是两种(完全实例化)类型的事实

编译器应该从最匹配的专门化中扣除这些参数的值吗

我不确定我是否理解你的问题,但如果我理解,那么答案是“不”。编译器不知道如何从类模板的裸名称(
B1
,在本例中为
B1
)推断出完全实例化的类型。您必须为
B1
指定模板参数

请记住,主模板的专门化是在为主模板提供必要的参数之后选择的。在这种情况下,主模板接受两个类型参数,并且必须提供两个类型参数


在模板专用化中使用模板参数
B
,以匹配作为
B
实例的类型参数,这一事实不会改变主模板的参数是两种(完全实例化的)类型的事实。

这是什么编译器?有些模板参数有问题。
C
需要两种类型。所以说
CWhat编译器是什么是没有意义的?有些模板参数有问题。
C
需要两种类型。所以对于模板参数说
CEven是没有意义的?这似乎很奇怪。@StoryTeller:主模板接受两个类型参数。template-template参数仅用于主模板的专门化,用于描述这些类型参数中的第一个。啊!现在我明白了。错过了专业化+1@AndyProwl:有没有办法改变
C
的设计,让编译器可以扣除“B1”的传递?@Muhammadalaa:我真的不知道你想在这里实现什么,以及你希望编译器如何推断出
B1
的无限有效实例之一。你能说得更具体些吗?(或者问一个全新的问题)甚至是模板参数?这似乎很奇怪。@StoryTeller:主模板接受两个类型参数。template-template参数仅用于主模板的专门化,用于描述这些类型参数中的第一个。啊!现在我明白了。错过了专业化+1@AndyProwl:有没有办法改变
C
的设计,让编译器可以扣除“B1”的传递?@Muhammadalaa:我真的不知道你想在这里实现什么,以及你希望编译器如何推断出
B1
的无限有效实例之一。你能说得更具体些吗?(或者问一个全新的问题)
error: use of class template B1 requires template arguments
   C< B1, A<10, int> > c;
      ^~