如何设置嵌套模板参数? 我目前正在使用一个模板类的C++项目。我以前做过,我知道单级模板参数是如何使用模板的。但是对于我当前项目中的类,我使用了以下内容(重要注意事项:为了阅读目的而进行了大量简化) 模板 结构B{ B(){} 空心钢筋(); }; 模板 结构A{ A(){} void foo(); }; 甲级模板; 模板类别B;

如何设置嵌套模板参数? 我目前正在使用一个模板类的C++项目。我以前做过,我知道单级模板参数是如何使用模板的。但是对于我当前项目中的类,我使用了以下内容(重要注意事项:为了阅读目的而进行了大量简化) 模板 结构B{ B(){} 空心钢筋(); }; 模板 结构A{ A(){} void foo(); }; 甲级模板; 模板类别B;,c++,templates,C++,Templates,只要我不调用foo()或bar(),编译和运行都很好。现在,我知道了如何使用 template<int k> void A<k>::foo(){ printf("foo %d\n", k); } 模板 void A::foo(){ printf(“foo%d\n”,k); } 我知道我可以 template<> void B<A<1> >::bar(){ printf("A<1> bar\n"); }

只要我不调用foo()或bar(),编译和运行都很好。现在,我知道了如何使用

template<int k>
void A<k>::foo(){
    printf("foo %d\n", k);
}
模板
void A::foo(){
printf(“foo%d\n”,k);
}
我知道我可以

template<>
void B<A<1> >::bar(){
    printf("A<1> bar\n");
}
模板
void B::bar(){
printf(“条形图”);
}
它将为B实现bar()。事情是这样的:我想对k使用多个值(k=1只是一个示例),而不必对所有情况复制上述值。这就是为什么我也想为bar()编写一个模板。但是,

template<int k>
void B<A<k> >::bar(){
    printf("Templated bar() for k=%d\n", k);
}
模板
void B::bar(){
printf(“k=%d\n”的模板条(),k);
}

不起作用。对于任何B
,模板条()的确切模板语句必须是什么?在这种情况下,类A和类B是在一个库(标题)中交付的,我不允许更改,而foo()和bar()仍有待实现。

您可以部分专门化
B
如下:

// this is unchanged
template<typename T>
struct B{
    B(){}
    void bar();
};

// but this is added by you
template <int k>
struct B<A<k>> {
    void bar();
};
//这是不变的
模板
结构B{
B(){}
空心钢筋();
};
//但这是你加的
模板
结构B{
空心钢筋();
};
这将使您能够实施:

template <int k>
void B<A<k>>::bar() {
    printf("A<k> bar\n");
}
模板
void B::bar(){
printf(“条形图”);
}
并运行:

int main() {
    B<A<3>> b{};

    b.bar();
}
intmain(){
B{};
b、 bar();
}

部分专门化是可以的(正如其他人所提到的),但是您必须实现原始类
B
中的所有成员。另一种方法是使用外部工具从
A
中提取
k
A\u traits


值得一提的是进一步的概括:
模板结构B{void bar(){printf(“bar%d\n,k);}
int main() {
    B<A<3>> b{};

    b.bar();
}
template <typename>
struct A_traits;

template <int K>
struct A_traits<A<K>> : std::integral_constant<int, K> {};
template <typename T>
void B<T>::bar() {
  printf("Templated bar() for k=%d\n", A_traits<T>::value);
}