代码之家  ›  专栏  ›  技术社区  ›  Milo Lu

标签发送过程中发生错误

  •  0
  • Milo Lu  · 技术社区  · 9 年前
    #include <iterator>
    #include <forward_list>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    template<typename C>
    using Iterator_type = typename C::iterator;
    
    template<typename Iter>
    using Iterator_category = typename iterator_traits<Iter>::iterator_category;
    
    template<typename Ran>
    void sort_helper(Ran beg, Ran end, random_access_iterator_tag){
        sort(beg,end);
    }
    
    template<typename For>
    void sort_helper(For beg, For end, forward_iterator_tag){
        vector<decltype(*beg)> vc{beg, end};
        sort(vc.begin(),vc.end());
        copy(vc.begin(),vc.end(),beg);
    }
    
    template<typename C>
    void sort(C& c){
        using Iter = Iterator_type<C>;
        sort_helper(c.begin(),c.end(),Iterator_category<Iter>{});
    }
    
    void test(vector<string>& vs, forward_list<double>& lls){
        sort(vs);
        sort(lls);
    }
    

    我得到一个编译错误——形成指向引用类型double&

    来自Bjarne Stroustrup的代码——C++编程语言 5.4.2.1迭代器_特征

    2 回复  |  直到 9 年前
        1
  •  2
  •   Bo Persson tox    9 年前

    来自Bjarne's errata list for the book :

    第125页:s/decltype(*beg)/Value_type<对于>/重新准备decltype的使用将占用比我这里更多的空间。

    vector<decltype(*beg)> 尝试创建 vector<double&> ,这是不可能的。

        2
  •  1
  •   Piotr Skotnicki    9 年前

    在以下声明中:

    vector<decltype(*beg)> vc{beg, end};
    

    这个 decltype 说明符产生一个引用类型(因为它取消引用一个导致左值的指针,并且它本身是一个表达式,或者,因为 operator* 来自 For 类类型声明引用类型作为其返回类型),该类型不能存储在向量中。相反,你应该利用 std::iterator_traits 再次获取基础类型。

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