2010-08-08 162 views
3

我正在嘗試編寫一個函數來爲日誌記錄目的「串化」參數。例如,我想寫的東西是這樣的:C++函數模板編譯錯誤「'containerType'不是模板」

vector<string> queries; 
set<uint_8> filters; 
LOG(INFO) << stringify<vector, string>(queries); 
LOG(INFO) << stringify<set, uint_8>(filters); 

下面是函數模板,我寫道:

template <typename containerType, typename elemType> 
string _stringify(const string name, const containerType<elemType> &elems) { 
    ostringstream os; 
    os << name << ": ["; 
    BOOST_FOREACH(elemType elem, elems) { 
     os << elem << ",";  
    } 
    os << "]"; 
    return os.str(); 
} 

以下是錯誤消息我:error: ‘containerType’ is not a template

謝謝, Alex

回答

9

您需要使用模板模板參數,例如,

template <template <typename> class containerType, typename elemType> 
string _stringify(const string name, const containerType<elemType>& elems) 

請注意,如果您希望將其與標準庫容器一起使用,它們中的大多數都有幾個模板參數(例如,序列容器有兩個:一個用於值類型,一個用於分配器類型)。

使用所有容器都有的value_type typedef可能更容易(也更好)。例如,

template <typename ContainerT> 
void f(const ContainerT& c) 
{ 
    typedef typename ContainerT::value_type ElementT; 
    // Use ContainerT and ElementT 
} 
+1

對於'value_type' +1。 – 2010-08-09 00:03:44

+0

謝謝詹姆斯,這是一個美麗的答案。更乾淨。謝謝。 – 2010-08-09 00:50:56