El problema de pokedex.cc esta con los funtores de los accumulate. El profesor me dijo que le un accumulate podia además de sumar enteros o tipos de datos simples le podias ir añadiendo una estructura de datos como map, set o vector. Aqui va el código.
pokedex.h
Código:
pokedex.cc#include <iostream>
#include <string>
#include <set>
#include <map>
#include <iterator>
#include <pokemon.h>
#include <utility>
#include <vector>
#include <numeric>
#ifndef _POKEDEX_H
#define _POKEDEX_H
///////////////////////////////////////////////////////////////////////////
//
// Definicion class pokedex
//
///////////////////////////////////////////////////////////////////////////
class pokedex
{
friend ostream & operator<<(ostream &, const pokedex &);
friend istream & operator>>(istream &, pokedex &);
public:
// constructores
pokedex();
// operaciones
const pokemon & info(const string &)const;
/* Necesita: el nombre de un pokemon
Produce: una referencia al objeto pokemon si existe
Error: si no existe debe generarse una excepcion
*/
void fusion(const pokedex &);
/* Necesita: otra coleccion de pokemons
Modifica: la actual aniadiendo los que no estuvieran ya en ella
*/
map<string,int> totales() const;
/* Produce: un diccionario conteniendo como clave los tipos de pokemons que hay y
como valor el numero de pokemons que hay de dicho tipo. Adicionalmente contendra
una entrada con clave "Total" conteniendo el total de pokemons en la coleccion
*/
set<string> tipos() const;
/* Produce: un conjunto conteniendo todos los tipos distintos del pokedex
*/
vector<pokemon> deTipo(const string &) const;
/* Necesita: un tipo de pokemon
Produce: un vector con todos los pokemons de ese tipo
*/
protected:
// area de datos
// cjto de pokemons -> pokemons
set<pokemon> data;
};
ostream & operator<<(ostream &, const pokedex & );
istream & operator>>(istream &, pokedex & );
#endif
Código:
El error de compilación es el siguiente:#include <pokedex.h>
#include <fstream>
struct funtor_findif {
funtor_findif(const string &n) : name(n) {}
bool operator()(const pokemon &p1) {
if( name==p1.dame_nombre() ) return true;
else return false;
}
string name;
};
struct funtor_accutotales {
map<string,int> operator() (map<string,int> &acum, const pokemon &p1) { // Epera el valor actual del acumulador, y el elemento que toca ahora en la nueva suma, con esto decides tu la nueva suma
pair<string,string> aux=p1.dame_tipos();
acum[aux.first]++;
if ( aux.second != "" ) {
acum[aux.second]++;
}
acum["Total"]++;
return acum;
}
};
struct funtor_accutipos {
set<string> operator() (set<string> &acum, const pokemon &p1) {
pair<string,string> aux=p1.dame_tipos();
acum.insert(acum.begin(),aux.first);
if ( aux.second != "" ) {
acum.insert(acum.begin(),aux.second);
}
return acum;
}
};
struct funtor_accudetipo {
public:
funtor_accudetipo(const string &t) : tipo(t) {}
vector<pokemon> operator() (vector<pokemon> &acum, const pokemon &p1) {
pair<string,string> aux=p1.dame_tipos();
if (aux.first==tipo) acum.push_back(p1);
if (aux.second==tipo) acum.push_back(p1);
return acum;
}
string tipo;
};
pokedex::pokedex() : data()
{
}
// Devuelve un objeto pokemon si existe en el conjunto
const pokemon & pokedex::info(const string & nombre)const {
linea54 set<pokemon>::iterator ret=find_if(data.begin(), data.end(), funtor_findif(nombre));
if ( ret != data.end() ) return *ret;
else {
cout<<"Error: Pokemon no existe"<<endl;
return *(data.end());
}
}
//
void pokedex::fusion(const pokedex & rhs) {
insert_iterator<set<pokemon> > itr_ins(data,data.begin());
set_union(rhs.data.begin(),rhs.data.end(),data.begin(),data.end(),itr_ins);
}
map<string,int> pokedex::totales() const { // accumulate y funcion objeto
// Retorna para cada tipo el numero de pokemons de dicho tipo
linea70 return accumulate(data.begin(), data.end(), map<string,int>(), funtor_accutotales());
}
set<string> pokedex::tipos() const {
/*acumulate y funtor*/
linea75 return accumulate(data.begin(), data.end(), set<string>(), funtor_accutipos());
}
vector<pokemon> pokedex::deTipo(const string & tipo) const {
/*acumulate y funtor*/
linea80 return accumulate(data.begin(), data.end(), vector<pokemon>(), funtor_accudetipo(tipo));
}
Cita:
Gracias de antemano./usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_numeric.h: In function ‘_Tp std::accumulate(_InputIterator, _InputIterator, _Tp, _BinaryOperation) [with _InputIterator = std::_Rb_tree_const_iterator<pokemon>, _Tp = std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >, _BinaryOperation = funtor_accutotales]’:
pokedex.cc:70: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_numeric.h:116: error: no hay coincidencia para la llamada a ‘(funtor_accutotales) (std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >&, const pokemon&)’
pokedex.cc:14: nota: los candidatos son: std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > > funtor_accutotales::operator()(std::map<std::basic _string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >, pokemon&)
pokedex.cc:75: instantiated from here
<lo mismo que antes>
pokedex.cc:80: instantiated from here
<lo mismo que antes>
pokedex.cc:54: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:188: error: no hay coincidencia para la llamada a ‘(funtor_findif) (const pokemon&)’
pokedex.cc:6: nota: los candidatos son: bool funtor_findif::operator()(pokemon&)
pokedex.cc:70: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_numeric.h:116: error: no hay coincidencia para la llamada a ‘(funtor_accutotales) (std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >&, const pokemon&)’
pokedex.cc:14: nota: los candidatos son: std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > > funtor_accutotales::operator()(std::map<std::basic _string<char, std::char_traits<char>, std::allocator<char> >, int, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int> > >, pokemon&)
pokedex.cc:75: instantiated from here
<lo mismo que antes>
pokedex.cc:80: instantiated from here
<lo mismo que antes>
pokedex.cc:54: instantiated from here
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:188: error: no hay coincidencia para la llamada a ‘(funtor_findif) (const pokemon&)’
pokedex.cc:6: nota: los candidatos son: bool funtor_findif::operator()(pokemon&)
EDITADO: YA FUNCIONA!!!

. Muchas gracias CalgaryCorpus 

