これは、この質問に対する James の回答のフォローアップです: Flattening iterator
テンプレートクラスを処理できるように、ジェームズのソリューションを変更しようとしています。関数の呼び出しで行き詰まることがわかりました(ここでは「フラット化」、ここでは「foo」)。発生するのは 3 つ (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)