4

这是 James 对这个问题的回答的后续行动:Flattening iterator

我尝试更改 James 的解决方案,以便它可以处理模板类。原来我在调用函数时卡住了(那里是“flatten”,这里是“foo”)。当我专门针对每个模板参数时它起作用了,这是可能的,因为只有三个 (1,2,3) 会发生。一般情况不编译。请参阅下面的代码和 gcc 的错误消息。

#include <iterator>
#include <vector>

template <int I> 
class A{};

template <int I>
void foo( typename std::vector< A <I> >::iterator first ,
          typename std::vector< A <I> >::iterator last) {}

//void foo( typename std::vector< A <1> >::iterator first , 
//          typename std::vector< A <1> >::iterator last) {} // this works

int main()
{
  std::vector< A<1> > v;
  foo(v.begin(),v.end());
  return 0;
}

使用 gcc 4.6.3 编译后的错误消息:

test_templ_func.cc: In function ‘int main()’:
test_templ_func.cc:15:24: error: no matching function for call to ‘foo(std::vector<A<1> >::iterator, std::vector<A<1> >::iterator)’
test_templ_func.cc:15:24: note: candidate is:
test_templ_func.cc:8:6: note: template<int I> void foo(typename std::vector<A<I> >::iterator, typename std::vector<A<I> >::iterator)
4

2 回答 2

2

这些是依赖类型参数,编译器无法解析它们,例如: 模板类中具有依赖类型参数的模板函数

您可以使用http://en.cppreference.com/w/cpp/types/enable_if并使用某些类型特征模板来解决问题。

模板推导指南

于 2012-07-11T16:51:23.113 回答
1

模板参数推导适用于许多情况,但它的作用有限。你已经达到了极限之一。

Stephan Lavavej(目前为 Microsoft 从事 STL 工作)刚刚制作了一个关于模板参数推导的精彩小视频。虽然他没有明确谈论您的示例,但他确实涵盖了一些类似的情况,并很好地概述了模板参数推导可以做什么。

于 2012-07-13T19:06:01.520 回答