我需要专门成员函数:
template <typename T>
int32_t writeVectorVariableUnit(
foo& classFoo,
typename std::vector<T>::const_iterator& start,
typename std::vector<T>::const_iterator& stop,
const std::string& name,
const std::string& unit,
const std::string& longName,
const std::vector<std::string>& dimName) const
以这种方式:
template <>
int32_t writeVectorVariableUnit(
foo& classFoo,
std::vector<uint16_t>::const_iterator& start,
std::vector<uint16_t>::const_iterator& stop,
const std::string& name,
const std::string& unit,
const std::string& longName,
const std::vector<std::string>& dimName) const;
但g ++编译器(redhat 6.7上的版本4.4.7)抱怨无法匹配任何模板声明:
错误:对于'int32_t,template-id'writeVectorVariableUnit&lt;&gt;' writeVectorVariableUnit(foo&amp;,__ nuu_cxx :: __ normal_iterator&gt;&gt;&amp;,__ nuu_cxx :: __ normal_iterator&gt;&gt;&amp;,const std :: string&amp;,const std :: string&amp;,const std :: string&amp;, const std :: vector, std :: allocator&gt;,std :: allocator,std :: allocator&gt; &GT; &gt;&amp;)const'没有 匹配任何模板声明
我怀疑这与typename的使用有关,我尝试了几种组合而没有成功。 你有什么建议吗?
答案 0 :(得分:3)
问题与typename
的使用无关,它们是
您应该从类定义中专门化模板。
对于std::vector<uint16_t>::const_iterator
,T
无法推断为uint16_t
,因为它属于non-deduced contexts。这意味着您必须明确指定专用模板参数。
如果模板参数仅在非推导的上下文中使用,则为 未明确指定,模板参数推断失败。
1)嵌套名称说明符(作用域左侧的所有内容) 解析运算符::)使用a指定的类型 合格-ID:
e.g。
template <>
int32_t bar::writeVectorVariableUnit<uint16_t> (
// ~~~~~ ~~~~~~~~~~
foo& classFoo,
std::vector<uint16_t>::const_iterator& start,
std::vector<uint16_t>::const_iterator& stop,
const std::string& name,
const std::string& unit,
const std::string& longName,
const std::vector<std::string>& dimName) const {
// ...
}
答案 1 :(得分:0)