C++ 我可以使用转换构造函数来处理模板参数中的继承链吗?

C++ 我可以使用转换构造函数来处理模板参数中的继承链吗?,c++,templates,inheritance,C++,Templates,Inheritance,假设我有类D,它继承自类B。我有一个模板类模板C。然后我有一个函数签名void foo(C)。为了使这一点在C的实例中起作用,我需要提供一个转换构造函数吗?类似于模板C(const C&C){}?由于任何D都是B?C和C将完全不是相关类型,因此,是的,您必须提供一个转换,允许从C构造C 这可能不会使类型完全兼容。例如,函数void foo(C&C)将无法使用该转换 这些不相关的类型是否能够足够兼容您的使用取决于您如何定义这些类型,以及您需要从它们中获得什么兼容性 您可以在标准12.3.2转换函

假设我有
类D
,它继承自
类B
。我有一个模板类
模板C
。然后我有一个函数签名
void foo(C)。为了使这一点在
C
的实例中起作用,我需要提供一个转换构造函数吗?类似于
模板C(const C&C){}
?由于任何
D
都是
B

C
C
将完全不是相关类型,因此,是的,您必须提供一个转换,允许从
C
构造
C

这可能不会使类型完全兼容。例如,函数
void foo(C&C)
将无法使用该转换

这些不相关的类型是否能够足够兼容您的使用取决于您如何定义这些类型,以及您需要从它们中获得什么兼容性



您可以在标准12.3.2转换函数[class.conv.fct]中阅读更多内容,并了解它们如何在重载解析13.3重载解析[over.match]中使用。

对,但在
C
C
的情况下,我认为应该“开箱即用”。除了构造之外,还有其他类型的转换运算符吗?我有兴趣从标准本身或在线的任何地方了解更多关于这方面的信息。不,在
C
C
之间进行转换不能“开箱即用”。它们不是相关类型。类型参数D和B是通过继承关联的,这一事实与模板专门化
C
C
没有任何关系。哦,是的,我想这不是我开箱即用的意思,而是谢谢!回答得很好,谢谢你的推荐。
struct B {};
struct D : B {};

template<typename T>
struct C {};

int main() {
    C<B> c = C<D>();
}
test1.cpp:9:10: error: no viable conversion from 'C<struct D>' to 'C<struct B>'
    C<B> c = C<D>();
         ^   ~~~~~~
struct B {};
struct D : B {};

template<typename T> struct C;

template<> struct C<B> { int i; }; // different specializations
template<> struct C<D> { double a, b, c; }; // can have different definitions
struct T {};

struct S {
    S() {}
    S(T const &) {}
    operator T () { return T(); }
};

void foo(T t) {}
void bar(S s) {}

int main() {
    foo(S()); // uses S::operator T ()
    bar(T()); // uses S::S(T const &)
}