0

任意のタイプのベクトルへのイテレータを引数として受け取るテンプレートをコーディングしようとしています。以下をコンパイルしようとすると、no matching function callエラーが発生します。

#include <vector>

struct A { int x; };

template <class T>
void process (typename std::vector<T>::iterator begin, 
              typename std::vector<T>::iterator end)
{ for(; begin != end; begin++) { /*do_something*/ } }

int main()
{
   std::vector <A> obj;
   process(obj.begin(), obj.end());
}
4

2 に答える 2

2

1引数の型から型Tを推測できません。

2std::vector要素への反復子のみを受け入れるように関数を制限したいのはなぜですか? 本当にベクトル要素だけが必要な場合はstd::vector<T> const&、引数として使用することをお勧めします。しかし、単純にイテレータ引数 (またはコンテナ引数) を取るほうがよいでしょう。


編集OK、ここに例があります。static_assertこれが (戻り値の型を除いて) と同じになる場合は、 を省略できます。std::for_each(begin,end,do_something);

template <class It>
void process(It begin, const It end)
{
  static_assert(std::is_same<typename std::iterator_traits<It>::iterator_category,
                             std::random_access_iterator_tag>::value,
                "arguments not random access iterators");
  for (; begin != end; ++begin)
    do_something(*begin);
}
于 2013-08-21T23:59:21.507 に答える
2

OPのリクエストに従って、以下を参照してください。operator *()ベクトル、両端キュー、リストなどからの値参照をサポートする任意の有効なコンテナ転送イテレータを使用できます。これは、クリスが言及した静的アサート ロジックを採用していません。

#include <iostream>
#include <iterator>

template<typename Iterator>
void process(Iterator start, Iterator stop)
{
    typedef typename std::iterator_traits<Iterator>::value_type value_type;
    for (Iterator it=start; it != stop; ++it)
    {
        const value_type& val = (*it);

        // do something with val
        std::cout << val << std::endl;
    }
}

int main()
{
    int ar[] = { 1,2,3,4,5 };

    process(std::begin(ar), std::end(ar));
    return 0;
}
于 2013-08-22T00:46:14.720 に答える