c ++模板特化,使用typename时出错

时间:2017-01-30 14:17:49

标签: c++ c++11 templates template-specialization

我需要专门成员函数:

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的使用有关,我尝试了几种组合而没有成功。 你有什么建议吗?

2 个答案:

答案 0 :(得分:3)

问题与typename的使用无关,它们是

  1. 您应该从类定义中专门化模板。

  2. 对于std::vector<uint16_t>::const_iteratorT无法推断为uint16_t,因为它属于non-deduced contexts。这意味着您必须明确指定专用模板参数。

  3.   

    如果模板参数仅在非推导的上下文中使用,则为   未明确指定,模板参数推断失败。

         

    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)

我相信T这里实际上是在一个非演绎的上下文中,所以函数实际上不能推导出T(see this question

最糟糕的情况你可以这样做:

writeVectorVariableUnit<float>

live demo