2016-12-03 11 views
0

でクラスメソッドにイテレータを渡すことはできません:は、私は、次の単純なクラスを持つC++

template <class T> class ListWrap 
{ 
    std::list<T> m_List; 
    explicit ListWrap(std::initializer_list<T> data) 
    { 
     Set(data); 
    } 
    void Set(std::initializer_list<T> data) 
    { 
     m_List.clear(); 
     m_List.insert(m_List.end(), data); 
    } 
}; 

これは正常に動作します、私は初期化子リストを使用して新しいオブジェクトListWrapをインスタンス化することができます。今度は、別のリストまたはイテレータからm_Listを設定して、コピーコンストラクタのそれを使用することもできます。

だから私は、以下を追加しようとしました:

// copy constructor 
explicit ListWrap(const ListWrap& Other) 
{ 
    Set(Other.m_List.begin()); 
} 
void Set(std::iterator<std::list<T>, T> Iterator) 
{ 
    m_List.clear(); 
    m_List.insert(m_List.end(), Iterator); 
} 

しかし、私がコンパイルしようとすると、今、私は次のエラーを取得する:

error C2664: cannot convert argument 1 from 
    'std::_List_const_iterator<std::_List_val<std::_List_simple_types<int>>>' 
to 'std::initializer_list<_Ty>'* 

このエラーメッセージがでSet()への呼び出しを指し、新しいコピーコンストラクタだから、 "古い" Set()メソッドをイテレータを受け取るSet()の2番目の "新しい"バージョンではなく、イニシャライザリストで使用しようとしているようです。

私はここで何が不足していますか?

+0

あなたが使用しようとしていますか? – alexolut

+0

@alexolut私はあまり気にしません。リストのコンテンツを 'm_List'に挿入したいだけです。 – Matthias

+0

コピーの目的のために、copy-ctorの中で 'm_List = Other.m_List;'を使うだけです。イテレーターでコピーしたい場合は、それらのペア(開始と終了)が必要です。 – alexolut

答えて

1
// copy constructor 
explicit ListWrap(const ListWrap& Other) 
{ 
    Set(Other.m_List.begin()); 
} 

Other const参照ので、Other.m_List.begin()CONSTイテレータです。

Set関数の引数の型には、std::iterator<const std::list<T>&, T>またはstd::list<T>::const_iteratorを試してください。

編集:

ここworking codeです。

#include <iostream> 
#include <list> 

using namespace std; 

template <class T> class ListWrap 
{ 
public: 
    std::list<T> m_List; 
    explicit ListWrap(std::initializer_list<T> data) 
    { 
     Set(data); 
    } 
    // copy constructor 
    explicit ListWrap(const ListWrap& Other) 
    { 
     Set(Other.m_List.begin(), Other.m_List.end()); 
    } 

    void Set(std::initializer_list<T> data) 
    { 
     m_List.clear(); 
     m_List.insert(m_List.end(), data); 
    } 

    //typename std::list<T>::const_iterator also works as argument type 
    void Set(decltype(m_List.cbegin()) beg, decltype(m_List.cbegin()) end) 
    { 
     m_List.clear(); 
     m_List.insert(m_List.end(), beg, end); 
    } 
}; 

int main() { 
    ListWrap<int> l({1,2,3}); 
    ListWrap<int> l2(l); 

    cout << l2.m_List.size() << endl; 

    return 0; 
} 

どうやらstd::list::insertは別のリストからではなく、初期化子リストからイテレータを使用する場合に3つの引数を持っている必要があります。コメントに示されているように、をSetとし、m_List = argとすることもできます。

+0

コンパイラが 'const_iterator'が未知の識別子であるとあなたの最初の提案は同じエラーメッセージにつながり、2番目の方法は機能しません。どのように 'const_iterator'をパラメータとして正しく使うことができますか? – Matthias

+0

それは、ありがとう! – Matthias

0

下記の解決策をご確認ください。テンプレートパラメータを使用しているため、const_iteratorがtypenameであることをコンパイラに通知する必要があります。 [ `のstd ::リスト:: insert`](http://en.cppreference.com/w/cpp/container/list/insert)が過負荷

void Set(typename std::list<T>::const_iterator iter)

関連する問題