4

これは、この質問に対する 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)
4

2 に答える 2

2

これらは依存型パラメーターであり、コンパイラーはそれらを解決できません。例: テンプレート クラス内の依存型パラメーターを持つテンプレート関数

http://en.cppreference.com/w/cpp/types/enable_ifを使用し、型特性テンプレートを使用することで回避できます。

テンプレートの判別ガイドライン

于 2012-07-11T16:51:23.113 に答える
1

テンプレート引数推定は多くの場合に機能しますが、できることには制限があります。制限の 1 つに達しました。

Stephan Lavavej (現在、Microsoft の STL に取り組んでいます) は、テンプレートの引数推定に関する素敵なビデオを作成しました。彼はあなたの例について明示的に話していませんが、いくつかの同様の状況をカバーしており、テンプレート引数演繹ができることの概要を説明しています。

于 2012-07-13T19:06:01.520 に答える