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)
这将产生一个链接错误,因为构造函数foo选template<typename T>Foo::Foo(const T &)来代替Foo::Foo(Parent&)。
如果c类型Parent为Child,则使用非模板构造函数,并且链接没有问题。
我可以解决这个问题
Foo foo ((Parent&) c);
Run Code Online (Sandbox Code Playgroud)
但是我不想那样做。
为什么C ++更喜欢使用模板而不是隐式转换c为Parent&?
我可以将类更改为偏向于铸造而不是模板,因此不需要解决方法吗?
一种解决方案是通过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)