問題は、コンストラクターテンプレートがコピーコンストラクターよりもよく一致することです。
// Copy constructor
WrappedStack( const WrappedStack &other )
// Constructor template
template <typename S>
WrappedStack( S &stack )
タイプのオブジェクトWrappedStack<T>
(クラステンプレートパラメーターT
は)でインスタンス化されると、コンストラクターテンプレートのインスタンス化された署名は次のようになります。
WrappedStack( WrappedStack<T> &stack )
const
これは、引数の型が修飾されていない場合、const
変換を必要としないため、コピーコンストラクターよりも適切に一致します。したがって、コンストラクターテンプレートはオーバーロード解決によって選択され、その本体がインスタンス化されて、発生しているエラーが発生します。
必要に応じてコンパイラにコピーコンストラクタを使用させるには、SFINAEを使用して、型WrappedStack<T>
または暗黙的にに変換可能な型のオブジェクトでコンストラクタテンプレートをインスタンス化するときに置換エラーを発生させることができます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 ) ) {}
この正常にコンパイルされた実例を参照してください。