的問題是,你的構造模板比你的拷貝構造函數更好的匹配:
// Copy constructor
WrappedStack(const WrappedStack &other)
// Constructor template
template <typename S>
WrappedStack(S &stack)
當WrappedStack<T>
類型(其中T
是類模板參數)的對象實例化,實例化的簽名的構造函數模板的外觀如下:
WrappedStack(WrappedStack<T> &stack)
如果參數的類型不是012,這比複製構造函數匹配得更好合格,因爲它不需要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)) {}
查看此succesfully compiling的實時示例。
'__stack'是保留名稱。不要使用雙下劃線,或者一般以下劃線開頭的名稱。 – 2013-03-17 00:15:13