首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解模板参数推导

理解模板参数推导
EN

Stack Overflow用户
提问于 2015-06-26 06:49:57
回答 2查看 126关注 0票数 9

考虑以下代码:

代码语言:javascript
复制
#include <vector>

template <typename T>
using v_itt = typename std::vector<T>::iterator;

template <typename T>
void foo(v_itt<T>){ }

int main() {
    typename std::vector<long>::iterator i = std::vector<long>().begin();
    foo(i); //candidate template ignored: couldn't infer template argument 'T'
}

演示

密码怎么了?我认为T应该被演绎成long。有办法解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-26 07:26:12

代码语言:javascript
复制
typename std::vector<T>::iterator

iterator (一个依赖类型)--在代码中它不是可还原的,因为它位于嵌套的名称说明符中,标准是这样的

第14.8.2.5/4号

但是,在某些情况下,该值不参与类型推断,而是使用在其他地方推导或显式指定的模板参数的值。如果模板参数仅在非推导上下文中使用,且未显式指定,则模板参数演绎失败。

第14.8.2.5/5节

未推导的上下文如下: -使用限定-id指定的类型的嵌套名称说明符。

所以这是一个没有推论的上下文。

可能的解决办法:

  1. 传递向量引用而不是迭代器
  2. 使用标记分派和编译时断言验证迭代器
票数 5
EN

Stack Overflow用户

发布于 2015-06-26 07:56:13

我只想在马可的回答中加入一个可能的解决办法3:

代码语言:javascript
复制
#include <vector>

template<typename T>
void real_foo( typename std::vector<T>::iterator){}

template <typename T>
void foo(T i){ real_foo<typename decltype(i)::value_type>(i); }

int main() {
    std::vector<long> v;
    foo(v.begin());
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31066712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档