2013-05-26 62 views
4

我有一個函數可以在任何類型的STL容器上運行,並且需要將容器的元素類型傳遞給另一個模板函數。實際上,當我說任何容器類型時,我並不是真正的意思。嚴格地說只有向量和數組。我有這樣的事情:接受任何類型的STL容器並使用其值類型

template <typename T> int ProcessData(T data) 
{ 
    return DoInternalProcessing<T::value_type>(data.data(), data.size()); 
} 

MSVC11接受此代碼,但gcc沒有。它出什麼問題了?對於gcc,我認爲值類型也是一個參數,但這需要調用者指定T(容器類型),這對於std :: array來說是非常笨拙的,這個函數的主要目的是提供一個非常簡單的接口從基礎數據中抽象出來。

+1

gcc給了什麼錯誤? –

+2

'return DoInternalProcessing (data.data(),data.size());'? –

+0

錯誤:意外的類型名稱'value_type':期望的表達式 – akai

回答

7

由於T::value_type是相關類型,因此您需要typename T::value_type

這不會對數組起作用 - 數組不會提供value_type的typedef,就像vector一樣。

通常的處理方法是接受一對迭代器(或指針,如果底層「集合」是一個數組)。在這種情況下,您可以使用std::iterator_traits<T>::value_type來獲取迭代器所引用的值類型。這將使用原始指針,因此(例如)​​3210將產生int

如果你真的需要使用一個容器(和支持數組),你可以使用std::begin(data)來得到一個迭代器到數據的開頭,然後使用std::iterator_traits<T>::value_type來獲取value_type。

+0

通過數組我的意思是提供value_type的std :: array,因此使用'typename T :: value_type'將適用於所有情況。 – akai

相關問題