我写了一个模板(如下所示)但是编译失败
template<class t, template<typename> class iterable>
Json::Value iterable2json(const iterable<t>& cont)
{
Json::Value v;
for(const t& elt : cont)
{
v.append(elt);
}
return v;
}
std::vector<int> vec{1,2,3};
Json::Value v = iterable2json(vec)
错误 C3312:找不到类型“const std::_Vector_val<_Val_types>”的可调用“开始”函数
与[ _Val_types=std::_Simple_types ]
参见正在编译的函数模板实例化 'Json::Value iterable2json,std::_Vector_val>(const std::_Vector_val<_Val_types> &)' 的引用
使用[ _Value_type=int, _Val_types=std::_Simple_types ]
错误 C3312:找不到类型为“const std::_Vector_val<_Val_types>”的可调用“结束”函数
与[ _Val_types=std::_Simple_types ]
error C2065: 'elt': 未声明的标识符
最佳答案
问题是编译器无法推断类型t
,因为它是通过模板模板参数间接确定的。但是,实际上根本就没有必要做那样的事情!以下工作正常:
template <typename Iterable>
Json::Value iterable2json(Iterable const& cont) {
Json::Value v;
for (auto&& element: cont) {
v.append(element);
}
return v;
}
(好吧,因为我没有你正在使用的 Json
库,所以我没有尝试编译它,但我认为它应该没问题)。
关于c++ - 如何编写模板将 vector 转换为 Json::Value (jsoncpp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26773043/