考虑以下代码:
#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。有办法解决这个问题吗?
发布于 2015-06-26 07:26:12
typename std::vector<T>::iteratoriterator (一个依赖类型)--在代码中它不是可还原的,因为它位于嵌套的名称说明符中,标准是这样的
第14.8.2.5/4号
但是,在某些情况下,该值不参与类型推断,而是使用在其他地方推导或显式指定的模板参数的值。如果模板参数仅在非推导上下文中使用,且未显式指定,则模板参数演绎失败。
第14.8.2.5/5节
未推导的上下文如下: -使用限定-id指定的类型的嵌套名称说明符。
所以这是一个没有推论的上下文。
可能的解决办法:
发布于 2015-06-26 07:56:13
我只想在马可的回答中加入一个可能的解决办法3:
#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());
}https://stackoverflow.com/questions/31066712
复制相似问题