2017-02-03 15 views
8

olarak varsayılan argüman: son parametre sıralama yöntemi için atlandığı takdirde Compare compstd::less yöntem olmalıdır kiC++ şablonları, bir yöntem seçimi tür Bu uygulama için

template <typename Iterator, typename Compare> 
void sort(Iterator begin, Iterator end, Compare comp) { 
    for (auto i = begin; i != end; ++i) { 
     auto min = i; 
     for (auto j = i + 1; j != end; ++j) { 
      if (comp(*j, *min)) { 
       min = j; 
      } 
     } 
     std::swap(*min, *i); 
    } 
} 

Nasıl değiştirmelisiniz?

ben başka bir yöntemi tanıtarak aşırı fonksiyonu çalıştı:

template <typename Iterator> 
void sort(Iterator begin, Iterator end) { 
    sort(begin, end, std::less<std::iterator_traits<Iterator>::value_type>()); 
} 

Ama böyle hatalar verdi: Bu ++ 14 c olduğu için

In file included from ../src/selection_sort_demo.cpp:1: 
../include/selection_sort.hpp:24:29: error: template argument for template type parameter must be a type; did you forget 'typename'? 
     sort(begin, end, std::less<std::iterator_traits<Iterator>::value_type>()); 
           ^
            typename 
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h:380:21: note: template parameter is declared here 
    template<typename _Tp> 
        ^
In file included from ../src/selection_sort_demo.cpp:1: 
../include/selection_sort.hpp:24:2: error: call to 'sort' is ambiguous 
     sort(begin, end, std::less<std::iterator_traits<Iterator>::value_type>()); 
     ^~~~ 
../src/selection_sort_demo.cpp:22:13: note: in instantiation of function template specialization 'selection::sort<__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > >' requested here 
     selection::sort(v.begin(), v.end()); 
       ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h:4727:5: note: candidate function [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, _Compare = std::less<int>] 
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 
    ^
../include/selection_sort.hpp:7:6: note: candidate function [with Iterator = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, Compare = std::less<int>] 
void sort(Iterator begin, Iterator end, Compare comp) 
    ^
2 errors generated. 
[2/4] Compiling cpp object 'test/[email protected]/selection_sort_test.cpp.o' 
FAILED: test/[email protected]/selection_sort_test.cpp.o 
clang++ '-Itest/[email protected]' '-Itest' '-I../test' '-I../include' '-Wall' '-Winvalid-pch' '-Wnon-virtual-dtor' '-std=c++14' '-O0' '-g' '-pthread' '-MMD' '-MQ' 'test/[email protected]/selection_sort_test.cpp.o' '-MF' 'test/[email protected]/selection_sort_test.cpp.o.d' -o 'test/[email protected]/selection_sort_test.cpp.o' -c ../test/selection_sort_test.cpp 
In file included from ../test/selection_sort_test.cpp:2: 
../include/selection_sort.hpp:24:29: error: template argument for template type parameter must be a type; did you forget 'typename'? 
     sort(begin, end, std::less<std::iterator_traits<Iterator>::value_type>()); 
           ^
            typename 
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/stl_function.h:380:21: note: template parameter is declared here 
    template<typename _Tp> 
        ^
In file included from ../test/selection_sort_test.cpp:2: 
../include/selection_sort.hpp:24:2: error: call to 'sort' is ambiguous 
     sort(begin, end, std::less<std::iterator_traits<Iterator>::value_type>()); 
     ^~~~ 
../test/selection_sort_test.cpp:17:13: note: in instantiation of function template specialization 'selection::sort<__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > > >' requested here 
     selection::sort(v1.begin(), v1.end()); 
       ^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/stl_algo.h:4727:5: note: candidate function [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, _Compare = std::less<int>] 
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last, 
    ^
../include/selection_sort.hpp:7:6: note: candidate function [with Iterator = __gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >, Compare = std::less<int>] 
void sort(Iterator begin, Iterator end, Compare comp) 
    ^
2 errors generated. 
+2

'Iterator' yerine typename Iterator'? – malat

+1

[Related Q] (http://stackoverflow.com/q/610245/1782465) – Angew

cevap

13

:

template <typename Iterator, typename Compare = std::less<> > 
void sort(Iterator begin, Iterator end, Compare comp = Compare()) 
{ 
    for (auto i = begin; i != end; ++i) { 
     auto min = i; 
     for (auto j = i + 1; j != end; ++j) { 
      if (comp(*j, *min)) { 
       min = j; 
      } 
     } 
     std::swap(*min, *i); 
    } 
} 

C++ 11:

template <typename Iterator, typename Compare = std::less< typename std::iterator_traits<Iterator>::value_type > > 
void sort(Iterator begin, Iterator end, Compare comp = Compare()) 
{ 
    for (auto i = begin; i != end; ++i) { 
     auto min = i; 
     for (auto j = i + 1; j != end; ++j) { 
      if (comp(*j, *min)) { 
       min = j; 
      } 
     } 
     std::swap(*min, *i); 
    } 
} 

Açıklama:

Derleyici hem şablon bağımsız değişken listesinde bir varsayılan tür hem de varsayılan işlev bağımsız değişken listesi sunmak zorundayız. std açıklama için

:: az <> C++ 14'e bakın başlangıcı:

http://en.cppreference.com/w/cpp/utility/functional/less

+0

Hey, daha az <> sonra boşluk gerekli değildir. –

+2

@PeterK siz ve derleyicinin bunlara ihtiyacı olmayabilir, ama yapıyorum! :-) –

+4

Eğer "Iterator ::' yerine "iterator_traits" öğesini kullanırsanız, kod tüm yineleyicilerle (işaretçiler dahil) çalışacaktır. – Angew

5

Sen haklıydın ama typename anahtar kelimeyi unuttum. Bunu denetleyin:

template <typename Iterator> 
void sort(Iterator begin, Iterator end) { 
    sort(begin, end, std::less<typename std::iterator_traits<Iterator>::value_type>()); 
} 

Muhtemelen varsayılan şablon argümanı istediniz, ancak bu da işe yarıyor.

+0

Bu, belirsiz aşırı yükü çözmüyor olsa da – Nazar554

+4

Nasıl belirsiz? Arit farklıdır. –

+0

üzgünüm, sadece MSVC'm 'std :: sort' üzerinden ADL'yi seçiyor – Nazar554