2013-03-16 66 views
2

我試圖使用泛型編碼風格來包裝通用堆棧的受限概念API。 我遇到的問題是我的一個構造函數,最重要的一個需要模板化堆棧,正在覆蓋我的拷貝構造函數。 我有一個問題,一些測試代碼的類梗概和錯誤,我從編譯器到這裏:https://gist.github.com/biot023/5178831泛型編程概念與複製構造函數衝突

我希望能夠使用值語義與我創建堆棧,我可以在剛分配給它們的一個向量。但是,這給我我的複製構造函數問題。

任何人都可以建議我怎樣才能明確地觸發複製構造函數(我只需要在我的測試代碼中執行),或者可以告訴我哪裏出錯了?

+2

'__stack'是保留名稱。不要使用雙下劃線,或者一般以下劃線開頭的名稱。 – 2013-03-17 00:15:13

回答

1

的問題是,你的構造模板比你的拷貝構造函數更好的匹配:

// 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的實時示例。

+0

'!std :: is_convertable const'> value'而不是'is_same'裏面的'enable_if'是一種讓模板構造函數總是讓位給你的WrappedStack構造函數的方法。 – Yakk 2013-03-17 00:22:20

+0

@Yakk:是的,好點。我將編輯我的答案 – 2013-03-17 00:35:22

+0

看起來我在SFINAE和enable_if上有一些相當有用的閱讀材料 - 非常感謝!謝謝你,現場工作空間也非常有趣。 – biot023 2013-03-17 01:55:56