我有一个给定的C ++代码使用模板并声明一个类C<T1, B1<T2> >
,类B1
作为模板参数。我现在希望C<T1, B2<T2> >
与B1
完全相同,除了我为B2
明确重新声明的一些函数。以下是从B2
继承B1
的小例子。
template <typename T1>
class B1 {};
template <typename T1>
class B2: public B1<T1> {};
template <typename T1, typename T2>
class C;
template <typename T1, typename T2>
class C<T1, B1<T2> >
{
public:
C(int i) {
// do sth.
}
};
template <typename T1, typename T2>
int getVal(C<T1, B2<T2> >& b2) {
return 2;
}
template <typename T1, typename T2>
int getVal(C<T1, B1<T2> >& b1) {
return 1;
}
template <typename T1, typename T2>
int doSomething(C<T1, B1<T2> >& c) {
return getVal(c);
}
int main()
{
C<int, B1<int> > c1(1);
C<int, B2<int> > c2(1);
cout << doSomething(c1); // output 1
cout << doSomething(c2); // output 2
return 0;
}
我想更改getVal()
的实施,而无需重新声明doSomething()
和C<T1, B2<T2> >
。不幸的是,这不起作用(错误:变量C<int, B2<int> > c2
具有初始化程序但不完整的类型)。
是否有任何优雅的方式,而无需重新声明C
及其所有功能?
P.S。:根据评论在main()中修复声明的函数。
答案 0 :(得分:1)
C ++模板专业化基于模式匹配。它不使用继承。
template <typename T1, typename T2> class C<T1, B1<T2> >
仅匹配B1
,就上述而言,B2
是不相关的类型。您的错误发生在doSomething
代码之前很久,它现在是一个红色的鲱鱼。
要做的第一件事是修复上面的代码段:
template <class T1, template<class>class B, class T2>
class C<T1, B<T2> >
现在它的模式匹配B1
和B2
。接下来对doSomething
执行相同的操作:
template <class T1, template<class>class B, class T2>
int doSomething(C<T1, B<T2> >& c)
并且代码应该可以工作。
如果需要,可以通过SFINAE进一步限制。