如何使C ++更喜欢匹配父类重载而不是模板?

spr*_*aff 4 c++ templates casting class-hierarchy

class Parent {};

class Child : public Parent {};

class Foo
{
public:

    Foo (Parent &) {};

    template <typename T>
    Foo (const T &);
};

int main ()
{
    Child c;

    Foo foo (c);
}
Run Code Online (Sandbox Code Playgroud)

这将产生一个链接错误,因为构造函数footemplate<typename T>Foo::Foo(const T &)来代替Foo::Foo(Parent&)

如果c类型ParentChild,则使用非模板构造函数,并且链接没有问题。

我可以解决这个问题

Foo foo ((Parent&) c);
Run Code Online (Sandbox Code Playgroud)

但是我不想那样做。

为什么C ++更喜欢使用模板而不是隐式转换cParent&

我可以将类更改为偏向于铸造而不是模板,因此不需要解决方法吗?

Que*_*tin 5

一种解决方案是通过SFINAE禁用模板构造函数:

template <
    typename T,
    std::enable_if_t<!std::is_base_of_v<Parent, T>> * = 0
>
Foo (const T &);
Run Code Online (Sandbox Code Playgroud)