【问题标题】:c++ template specialization, error when using typename [duplicate]c ++模板专业化,使用类型名时出错[重复]
【发布时间】:2017-01-30 14:17:48
【问题描述】:

我需要专门化一个成员函数:

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 版)抱怨无法匹配任何模板声明:

错误:模板 id 'writeVectorVariableUnit' for 'int32_t writeVectorVariableUnit(foo&, __gnu_cxx::__normal_iterator > >&, __gnu_cxx::__normal_iterator > >&, const std::string&, const std::string&, const std::string&, 常量标准::向量, std::allocator >, std::allocator, std::allocator > > >&) const' 不 匹配任何模板声明

我怀疑与typename的用法有关,我尝试了几种组合都没有成功。 你有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    问题与typename的用法无关,是

    1. 您应该在类定义之外专门化模板。

    2. 对于std::vector&lt;uint16_t&gt;::const_iteratorT 不能推导出为uint16_t,因为它属于non-deduced contexts。这意味着您必须明确指定专用模板参数。

    如果模板参数仅在非推导上下文中使用并且是 未明确指定,模板参数推导失败。

    1) 嵌套名称说明符(范围左侧的所有内容 使用 a 指定的类型的解析运算符 ::) 合格的ID:

    例如

    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 {
        // ...
    }
    

    【讨论】:

      【解决方案2】:

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

      你能做的最坏情况:

      writeVectorVariableUnit<float>
      

      live demo

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2020-07-18
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多