C++ 从模板基类派生的类的隐式强制转换

C++ 从模板基类派生的类的隐式强制转换,c++,templates,inheritance,casting,implicit,C++,Templates,Inheritance,Casting,Implicit,我在隐式转换、模板和模板类继承方面遇到了问题。下面是我从我的项目中提取的内容,我忽略了一些类甚至是抽象的,但这与案例无关 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();

我在隐式转换、模板和模板类继承方面遇到了问题。下面是我从我的项目中提取的内容,我忽略了一些类甚至是抽象的,但这与案例无关

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();
}
A类{};
B类:公共A{};
模板类基类{};
派生类:公共基{};
int main(){
导出d;
Base*Base=new-Derived();
}
基本上,我有一个模板基类
base
,我从中派生
Derived:public base
。然后我必须把它转换成最普遍的基本形式,即
Base

我本以为我可以隐式地将一个派生自
Base
的对象强制转换为
Base
,就像
B
派生自
A
一样。我做错了什么事,或者我怎么能含蓄地表达出来?这很重要,因为我需要接受
Base
方法中所有类型的派生类作为参数


提前谢谢。

这是不可能的<代码>基础与
基础
没有关系,无论A和B之间的关系如何。

基础
不一定需要与
基础
有关系。这与派生的
没有任何关系。如果您想要强制这样的关系,您将需要一个模板化的构造函数

template <typename T>
class Base
{
    template <typename TOther>
    Base(const TOther& that)
    {
        // ...
    }
    // ...
};
模板
阶级基础
{
模板
基地(康斯特·托瑟和那个)
{
// ...
}
// ...
};

显然,实现必须取决于
Base
的实际实现。请注意,此构造函数不能替代普通的复制构造函数。

好的,谢谢。您将如何尝试修复此问题。你会考虑Booo::作为一种选择吗?如果没有更多信息,我只能建议这样做。尽管我无法使用static_assert(std::is_base_of(…))检查模板,但该模板似乎可以工作,但这并不太重要。因为类“base”将是引擎的一部分,“Other”将是实际应用程序的一部分。无论如何,谢谢。我不是要告诉你如何构建你的代码,但没有理由模板构造函数不能出现在你的头文件中,而只是调用一个隐藏函数来完成实际工作。“不是要告诉你如何构建你的代码”哦,你最好这样-我被那些模板弄糊涂了,所以我实际上忘记了它们是如何工作的。对不起,D我会考虑你的答案作为选择。
template <typename T>
class Base
{
    template <typename TOther>
    Base(const TOther& that)
    {
        // ...
    }
    // ...
};