【发布时间】:2021-03-02 01:56:11
【问题描述】:
此程序无法编译:
template <class T>
struct Base {
Base();
template <class U>
Base(const Base<U>&);
};
template <class T>
struct Doh : Base<T> {
using Base<T>::Base;
};
template <class T>
struct Derp : Base<T> {
using Base<T>::Base;
};
Doh<void> x = Derp<void>();
错误消息显示inherited constructor cannot be used to copy object。 Live demo.
但是当我们把最后一行改成这个时,它就可以编译了。
Doh<void> doh;
Doh<void> x1 = doh;
Doh<void> x2 = Derp<void*>();
Doh<void> x3(Derp<void>());
在这三种情况下可以使用继承的构造函数。为什么?
【问题讨论】:
-
多么卑鄙!我在 Compiler Explorer 编译时获得了您的示例:Fixed Demo on Compiler Explorer。在摆弄了一段时间后,我将错误减少为对
Doh<void>的已删除复制构造函数的单一抱怨。Doh不是Derk???初始化似乎导致了一个中间步骤 - 类似于Doh<void> x = Doh<void>(Derk<void>());... 但是,我无法详细解释这一点。只是我有时在 VS2013 中遇到了类似的问题(并且一直认为这只是因为 VS2013 太老了。);-) -
请注意
template <class U> Base(const Base<U>&)不是复制构造函数,Base(const Base<T>&)仍会生成。 -
@Jarod42:你是对的。 Demo.
标签: c++ inheritance copy-constructor