簡體   English   中英

遇到錯誤:“struct std::iterator_traits”中沒有名為“iterator_category”的類型<std::vector<int> &gt;

[英]Encountring error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<std::vector<int> >

我正在嘗試創建一個程序,該程序將基於迭代器(無論是前向迭代器還是隨機訪問迭代器)對整數序列進行排序。 但是當我嘗試傳遞vector時遇到此錯誤:

錯誤:'struct std::iterator_traits<std::vector<int> > 中沒有名為“iterator_category”的類型

我在傳遞forward_list時也遇到了同樣的問題:

錯誤:“struct std::iterator_traits<std::forward_list<int> >”中沒有名為“iterator_category”的類型

這是我的代碼:

#include<iostream>
#include<vector>
#include<forward_list>
#include<iterator>
#include<algorithm>
#include<typeinfo>
using namespace std;

template<typename Ran>
void sort_helper(Ran beg, Ran end, random_access_iterator_tag){
    /*
    Random access iterator version of sort
    */
    sort(beg, end);
}

template<typename For>
void sort_helper(For beg, For end, forward_iterator_tag){
    /*
    The version for forward iterators is almost as simple; just copy the list into a vector, sort, and copy
    back again:
    */
    vector<decltype(*beg)> vec{beg, end};
    sort(vec.begin(), vec.end());
    copy(vec.begin(), vec.end(), beg);

}

template<class Iter>
void testSort(Iter& c){
    sort_helper(c.begin(), c.end(), typename std::iterator_traits<Iter>::iterator_category{});
}

int main(int argc, char** argv){
    vector<int> vec = {3, 5, 1, 2, 3, 1, 5, 88};
    forward_list<int> flst = {6, 4, 6, 1, 4, 77, 1, 23, 2, 4};

    testSort(vec);
    testSort(flst);

    for(auto& x:vec){
        cout<<x<<" ";
    }cout<<"\n";

    for(auto& x:flst){
        cout<<x<<" ";
    }cout<<"\n";
}

在您的testSort()函數中, Iter模板參數(其名稱具有誤導性,順便說一句)正在接收容器類型,但iterator_traits需要一個迭代器類型。

這將在您的示例中起作用:

template<class Container>
void testSort(Container& c){
    sort_helper(c.begin(), c.end(),
        typename std::iterator_traits<typename Container::iterator>::iterator_category{}
    );
}

但是,這不適用於沒有begin()end()iterator成員的原始 C 樣式數組。 但這對他們有用:

template<class Container>
void testSort(Container& c){
    sort_helper(std::begin(c), std::end(c),
        typename std::iterator_traits<decltype(std::begin(c))>::iterator_category{}
    );
}

另一個問題是,這一行也無法編譯:

std::vector<decltype(*beg)> vec{beg, end};

這是因為取消引用迭代器會返回對被引用元素的引用,因此decltype(*beg)返回引用類型,這會阻止vector::pointervector::const_pointer成員可聲明:

錯誤:形成指向引用類型“int&”的指針

這將起作用:

std::vector<typename std::remove_reference<decltype(*beg)>::type> vec{beg, end};

但是,您可以在此處改用iterator_traits ,它有一個value_type成員:

std::vector<typename std::iterator_traits<For>::value_type> vec{beg, end};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM