我写了一个模板(如下所示),但无法编译
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:无法调用&#39;开始&#39;找到类型&#39; const std :: _ Vector_val&lt; _Val_types&gt;&#39;
的函数使用[_Val_types = std :: _ Simple_types]
参见函数模板实例化&#39; Json :: Value iterable2json,std :: _ Vector_val&gt;(const std :: _ Vector_val&lt; _Val_types&gt;&amp;)&#39;正在编制
[_Value_type = int,_Val_types = std :: _ Simple_types]
错误C3312:无法调用&#39;结束&#39;找到类型&#39; const std :: _ Vector_val&lt; _Val_types&gt;&#39;
的函数使用[_Val_types = std :: _ Simple_types]
错误C2065:&#39; elt&#39; :未声明的标识符
答案 0 :(得分:6)
问题是编译器无法推断类型t
,因为它是通过模板模板参数间接确定的。但是,实际上首先没有必要做这样的事情!以下工作正常:
template <typename Iterable>
Json::Value iterable2json(Iterable const& cont) {
Json::Value v;
for (auto&& element: cont) {
v.append(element);
}
return v;
}
(好吧,因为我没有你正在使用的Json
库,我没有尝试编译它,但我认为它应该没问题。)