Newsgroup: it.comp.lang.c++
Titolo: template e iteratori

ciao a tutti, qualcuno mi spiega perché questo spezzone non compila?
$ g++ -Wall test.cpp
test.cpp: In function ‘int main()’:
test.cpp:13: error: no matching function for call to
‘f(__gnu_cxx::__normal_iterator<int*, std::vector<int,
std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*,
std::vector<int, std::allocator<int> > >)’
$ cat test.cpp
#include <iostream>
#include <vector>
using namespace std;
template <typename T> void f(typename T::const_iterator beg,
                             typename T::const_iterator end) {
    return;
}
int main() {
    vector<int> v;
    f(v.begin(), v.end());
}
$

 ciao a tutti, qualcuno mi spiega perch� questo spezzone non compila?
Cos� compila:
#include <iostream>
#include <vector>
using namespace std;
template <typename T> void f(typename T::const_iterator beg,
                             typename T::const_iterator end) {
    return;
}
int main() {
    vector<int> v;
    f<vector<int> >(v.begin(), v.end());
}
Ma forse non era quello che volevi?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 


no, così va bene.
Non capisco però perché c'è bisogno di specificare il tipo...

 Non capisco per� perch� c'� bisogno di specificare il tipo...
non pu� dedurlo,
Comeau genera un errore pi� comprensibile:
  error: no instance of function template "f" matches the
  argument list
  The argument types that you used are: (int *, int *)
prova a vederla cos�, magari � pi� semplice:
#include <iostream>
#include <vector>
template <typename T> 
void f(typename T::const_iterator beg
    , typename T::const_iterator end
){
    return;
}
int main() {
    std::vector<int> v;
    std::vector<int>::const_iterator b = v.begin();
    std::vector<int>::const_iterator e = v.end();
    f(b,e);
}
se l'intento non era quello di stabilire un contratto
pi� forte (ma che mi sfugge) potresti riscriverla
semplicemente come:
template <typename T> 
void f(T beg, T end)
{
    return;
}
ciao!
-- 
sbi
"Objects grouped together are seen as a whole" 
                      Gestalt's law of closure

 }
l'intento era di scrivere una funzione che restituisse l'elemento più
frequente del container.
(solo per esercizio con la scrittura di funzioni generiche)
qualcosa con questo prototipo:
template <typename T> typename T::value_type f2(typename
T::const_iterator beg,
                                                typename
T::const_iterator end) {
    T::value_type el;
    /* cerca e copia in el l'elemento più frequente */
    return el;
}
int main() {
    vector<int> v;
    int el = f(v.begin(), v.end();
}
ciao

 (solo per esercizio con la scrittura di funzioni generiche)
bool second_gt(const std::pair<int, int>& lhs,
const std::pair<int, int>& rhs)
{
    return lhs.second < rhs.second;
}
template <typename T> 
T f(T b, T e) 
{
    std::map<int,int> freq;
    for( T iter=b; iter!=e; ++iter) {
        ++freq[std::distance(b, std::find(b,e,*iter))];
    }
    std::advance(b,
        std::max_element(freq.begin(), freq.end(), second_gt)->first
    );
    return b;
}
- int v[] = {0,1,5,3,5,2,5};
- size_t v1_size = sizeof(v1) / sizeof(v1[0]);
- std::cout << *f(v1,v1+v1_size) << std::endl;
+ 5
puoi sicuramente far meglio eh,
-- 
"Language shapes the way we think, and determines what 
we can think about."              # Benjamin Lee Whorf
sbi