我遇到了隐式转换,模板和模板类继承的问题。以下是我从项目中提取的内容,我遗漏了一些类甚至是抽象的,但它与案例没有关系。
class A {};
class B : public A {};
template <typename T> class Base {};
class Derived : public Base<B> {};
int main() {
Derived d;
Base<A>* base = new Derived();
}
基本上,我有一个模板基类Base
,我从中派生Derived : public Base<B>
。然后我必须将其转换为最常见的Base形式,即Base<A>
。
我原以为我可以隐式地从Base<B>
到Base<A>
投射一个对象,因为B
来自A
。我做错了什么,或者我怎么能隐含地 ?这很重要,因为我需要在Base
方法中接受所有类型的派生类作为参数。
提前致谢。
答案 0 :(得分:6)
这是不可能的。无论A和B之间的关系如何,Base<A>
与Base<B>
的无关系。
答案 1 :(得分:2)
Base<B>
不一定需要与Base<A>
有关系。这与Derived
没有任何关系。如果你想强制这样的关系,你将需要一个模板化的构造函数。
template <typename T>
class Base
{
template <typename TOther>
Base(const TOther& that)
{
// ...
}
// ...
};
显然,实施必须依赖于Base
的实际实施。请注意,此构造函数不替代正常的复制构造函数。