C++ 模板多态性不工作?
我正在构建一个小的模板层次结构,并尝试利用类多态性。下面是一些示例代码(未编译)来演示:C++ 模板多态性不工作?,c++,templates,polymorphism,C++,Templates,Polymorphism,我正在构建一个小的模板层次结构,并尝试利用类多态性。下面是一些示例代码(未编译)来演示: template<typename T> struct A {}; template<typename T> struct B { B (A<B> *) {} }; struct C : public B<int> { C(A<C> *p) : B<int>(p) {} // error }; int main(
template<typename T>
struct A
{};
template<typename T>
struct B
{
B (A<B> *) {}
};
struct C : public B<int>
{
C(A<C> *p) : B<int>(p) {} // error
};
int main() {
A<C> ac;
C c(&ac);
}
模板
结构A
{};
模板
结构B
{
B(A*){}
};
结构C:公共B
{
C(A*p):B(p){}//错误
};
int main(){
空调;
C&ac;
}
我的编译器(OS X上的gcc 4.01)在指定行上抛出以下错误:
error: no matching function for call to ‘B<int>::B(A<C>*&)’
错误:调用“B::B(A*&)”时没有匹配的函数
但从我的逻辑假设来看,代码应该是有效的,因为
C == B<int>
B<int> == B<T>
=> A<C> == A<B<T> >
C==B
B==B
=>A==A
有人能指出我的错误在哪里以及如何改正吗
编辑 答案似乎是,常规继承树无法解决我的问题,因为模板是静态的,无法识别多态性。那么,将A
struct C : public B<int>
{
C(A<C> *p) : B<int>((A<B<int> > *)p) {}
};
结构C:公共B
{
C(A*p):B((A*p){}
};
这个问题有什么“好”的解决方案吗?A>与A
template<typename T>
struct B
{
template< typename E>
B (E *) {}
};
struct C : public B<int>
{
template< typename E>
C(E *p) : B<int>(p) {}
};
模板
结构B
{
模板
B(E*){}
};
结构C:公共B
{
模板
C(E*p):B(p){}
};
然而,这个问题太抽象,无法给出解决方案……首先,这是:
C == B<int>
B<int> == B<T>
因此,这是非法的(允许它也存在实现问题)。此外,也没有办法选择方差的C++模板。每个模板实例化都只是一个不同的类,其基类仅是定义中基类列表中特别列出的那些类。它与同一类模板的其他实例化没有特殊关系
因此,在您的例子中,A
与A
的类型不同,它们之间也不存在任何隐式(或有意义的显式)指针转换
struct Base {...};
struct Derived1 : Base {...};
struct Derived2 : Base {...};
std::list<Derived1> dl;
std::list<Base>& bl = dl;
bl.push_back(Derived2()); // dl is a list of Derived1, but we just put
// an instance of Derived2 into it...