c ++函数模板编译错误“'containerType'不是模板”

时间:2010-08-08 23:41:11

标签: c++ templates generics

我正在尝试编写一个函数来“stringify”参数以进行日志记录。例如,我想写这样的东西:

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

谢谢, 亚历

1 个答案:

答案 0 :(得分: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
}