问题是您的构造函数模板比您的复制构造函数更匹配:
// Copy constructor
WrappedStack( const WrappedStack &other )
// Constructor template
template <typename S>
WrappedStack( S &stack )
当使用类型对象WrappedStack<T>
(类T
模板参数在哪里)进行实例化时,构造函数模板的实例化签名将如下所示:
WrappedStack( WrappedStack<T> &stack )
如果参数的类型不是 - 限定的,这比复制构造函数更好const
,因为它不需要const
转换。因此,构造函数模板将被重载解析选中,并且其主体将被实例化,从而导致您遇到的错误。
WrappedStack<T>
要强制编译器在适当时使用复制构造函数,您可以使用 SFINAE 在使用 类型或可隐式转换为 的类型的对象实例化构造函数模板时导致替换失败WrappedStack<T>
。例如:
#include <type_traits>
template<
typename S,
typename std::enable_if<
!std::is_convertible<S, WrappedStack<T> const&>::value
>::type* = nullptr>
WrappedStack( S &stack ) : __stack( new wrapped_stack_t<S, T>( stack ) ) {}
查看此成功编译的实时示例。