#include <stdio.h>
namespace named
{
template < typename RandomIt>
void sort_it_it( RandomIt first, RandomIt last)
{
( void ) last;
( void ) ( first + 1 ) ;
( void ) ( bool ( * first < * first) ) ;
// stuff...
}
template < typename Container, typename Compare>
void sort_cont_cmp( Container& c, Compare cmp)
{
typename Container:: iterator b = c.begin ( ) , e = c.end ( ) ;
( void ) e;
( void ) ( b + 1 ) ;
( void ) ( bool ( cmp( * b, * b) ) ) ;
// stuff...
}
}
namespace overloaded
{
template < typename RandomIt>
void sort( RandomIt first, RandomIt last)
{
puts ( "sort(RandomIt, RandomIt)" ) ;
named:: sort_it_it ( first, last) ;
}
template < typename Container, typename Compare>
void sort( Container& c, Compare cmp)
{
puts ( "sort(Container&, Compare)" ) ;
named:: sort_cont_cmp ( c, cmp) ;
}
}
struct BadContCmp { // Not complete. Bad.
int x[ 10 ] ;
BadContCmp( ) { for ( int i = 0 ; i < 10 ; ++ i) x[ i] = 42 ; } // LOL.
typedef int * iterator;
iterator begin( ) { return x; }
iterator end( ) { return x + 10 ; }
typedef bool result_type;
typedef int first_argument_type;
typedef int second_argument_type;
bool operator( ) ( int const & a, int const & b) const { return a < b; }
} ;
int main( )
{
BadContCmp contcmp;
named:: sort_it_it ( contcmp.begin ( ) , contcmp.end ( ) ) ; // ok (of course)
named:: sort_cont_cmp ( contcmp, contcmp) ; // ok (of course)
overloaded:: sort ( contcmp.begin ( ) , contcmp.end ( ) ) ; // ok
overloaded:: sort ( contcmp, contcmp) ; // error (inside the body of sort_it_it)
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpuYW1lc3BhY2UgbmFtZWQKewoJdGVtcGxhdGU8dHlwZW5hbWUgUmFuZG9tSXQ+Cgl2b2lkIHNvcnRfaXRfaXQoUmFuZG9tSXQgZmlyc3QsIFJhbmRvbUl0IGxhc3QpCgl7CgkJKHZvaWQpIGxhc3Q7CgkJKHZvaWQpIChmaXJzdCArIDEpOwoJCSh2b2lkKSAoYm9vbCgqZmlyc3QgPCAqZmlyc3QpKTsKCQkvLyBzdHVmZi4uLgoJfQoJCgl0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIENvbXBhcmU+Cgl2b2lkIHNvcnRfY29udF9jbXAoQ29udGFpbmVyJiBjLCBDb21wYXJlIGNtcCkKCXsKCQl0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yIGIgPSBjLmJlZ2luKCksIGUgPSBjLmVuZCgpOwoJCSh2b2lkKSBlOwoJCSh2b2lkKSAoYiArIDEpOwoJCSh2b2lkKSAoYm9vbChjbXAoKmIsICpiKSkpOwoJCS8vIHN0dWZmLi4uCgl9Cn0KCm5hbWVzcGFjZSBvdmVybG9hZGVkCnsKCXRlbXBsYXRlPHR5cGVuYW1lIFJhbmRvbUl0PgoJdm9pZCBzb3J0KFJhbmRvbUl0IGZpcnN0LCBSYW5kb21JdCBsYXN0KQoJewoJCXB1dHMoInNvcnQoUmFuZG9tSXQsIFJhbmRvbUl0KSIpOwoJCW5hbWVkOjpzb3J0X2l0X2l0KGZpcnN0LCBsYXN0KTsKCX0KCQoJdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSBDb21wYXJlPgoJdm9pZCBzb3J0KENvbnRhaW5lciYgYywgQ29tcGFyZSBjbXApCgl7CgkJcHV0cygic29ydChDb250YWluZXImLCBDb21wYXJlKSIpOwoJCW5hbWVkOjpzb3J0X2NvbnRfY21wKGMsIGNtcCk7Cgl9Cn0KCnN0cnVjdCBCYWRDb250Q21wIHsgLy8gTm90IGNvbXBsZXRlLiBCYWQuCglpbnQgeFsxMF07CgkKCUJhZENvbnRDbXAoKSB7IGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeFtpXSA9IDQyOyB9IC8vIExPTC4KCQoJdHlwZWRlZiBpbnQgKiBpdGVyYXRvcjsKCWl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4geDsgfQoJaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiB4ICsgMTA7IH0KCQoJdHlwZWRlZiBib29sIHJlc3VsdF90eXBlOwoJdHlwZWRlZiBpbnQgZmlyc3RfYXJndW1lbnRfdHlwZTsKCXR5cGVkZWYgaW50IHNlY29uZF9hcmd1bWVudF90eXBlOwoJYm9vbCBvcGVyYXRvcigpKGludCBjb25zdCYgYSwgaW50IGNvbnN0JiBiKSBjb25zdCB7IHJldHVybiBhIDwgYjsgfQp9OwoKaW50IG1haW4oKQp7CglCYWRDb250Q21wIGNvbnRjbXA7CgkKCW5hbWVkOjpzb3J0X2l0X2l0KGNvbnRjbXAuYmVnaW4oKSwgY29udGNtcC5lbmQoKSk7IC8vIG9rIChvZiBjb3Vyc2UpCgluYW1lZDo6c29ydF9jb250X2NtcChjb250Y21wLCBjb250Y21wKTsgLy8gb2sgKG9mIGNvdXJzZSkKCQoJb3ZlcmxvYWRlZDo6c29ydChjb250Y21wLmJlZ2luKCksIGNvbnRjbXAuZW5kKCkpOyAvLyBvawoJb3ZlcmxvYWRlZDo6c29ydChjb250Y21wLCBjb250Y21wKTsgLy8gZXJyb3IgKGluc2lkZSB0aGUgYm9keSBvZiBzb3J0X2l0X2l0KQp9
compilation info
prog.cpp: In instantiation of ‘void named::sort_it_it(RandomIt, RandomIt) [with RandomIt = BadContCmp]’:
prog.cpp:31:32: required from ‘void overloaded::sort(RandomIt, RandomIt) [with RandomIt = BadContCmp]’
prog.cpp:65:35: required from here
prog.cpp:9:17: error: no match for ‘operator+’ (operand types are ‘BadContCmp’ and ‘int’)
(void) (first + 1);
^
prog.cpp:10:25: error: no match for ‘operator*’ (operand type is ‘BadContCmp’)
(void) (bool(*first < *first));
^
prog.cpp:10:16: error: no match for ‘operator*’ (operand type is ‘BadContCmp’)
(void) (bool(*first < *first));
^
stdout