Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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/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++ 模板多态性不工作?_C++_Templates_Polymorphism - Fatal编程技术网

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强制转换为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的类型不同,即使C是从B派生出来的

因此,类型为A*的构造函数C的参数与构造函数B请求的参数不兼容,后者是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...