Hola a todos,
Estoy teniendo problemas con un trozo de código y empiezo a sospechar de la "custom key" que uso para el map. La clave se compone de un puntero y un enum, el orden es primero segun el puntero, luego segun el enum:
struct PixelShaderSetupId {
IDirect3DPixelShader9* d3d_shader;
D3DCMPFUNC alpha_func;
PixelShaderSetupId() {
d3d_shader = 0;
alpha_func = D3DCMP_ALWAYS;
}
PixelShaderSetupId(IDirect3DPixelShader9* _d3d_shader, D3DCMPFUNC _alpha_func) {
d3d_shader = _d3d_shader;
alpha_func = _alpha_func;
}
bool operator<(const PixelShaderSetupId &b) const {
if((unsigned int)(d3d_shader) < (unsigned int)(b.d3d_shader))
return true;
else if((unsigned int)(d3d_shader) > (unsigned int)(b.d3d_shader))
return false;
else
return (unsigned int)(alpha_func) < (unsigned int)(b.alpha_func);
}
bool operator==(const PixelShaderSetupId &b) const {
return (d3d_shader == b.d3d_shader) && (alpha_func == b.alpha_func);
}
};
¿Veis algo incorrecto? Tengo un juego de pruebas bastante gordo y el código funciona el 99% de las veces, así que el fallo debe ser sutil.
Gracias,
Chema
Hola, creo que debes darle al map una función binaria. Como ejemplo:
bool funcionCompara(double x, double y) { return fabs(x) < fabs(y); }
Cambiando double por el tipo de la clave(key) del map. Y el código de comparación claro.
Un saludo
Normalmente no es necesario pasar una función de comparación a std::map, porque este último está declarado como (sección 23.3.1/2 del estándar):
namespace std {
template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T> > >
class map {...};
} // namespace std
Y std::less devuelve el resultado de aplicar el operador menor-que.
Sin más información, es complicado responder sin recurrir a la mera especulación. Viendo el código me pregunto, por ejemplo, por qué en la implementación del operador menor-que de PixelShaderSetupId comparas enteros sin signo resultado de castings desde punteros a IDirect3DPixelShader9 [1] [2].
[1] Es conveniente notar (únicamente por completitud) que, de acuerdo con 5.2.10/5, "[...] mappings between pointers and integers are otherwise implementation-defined".
[2] Dicho sea de paso, puedes utilizar uno de los typedefs declarados en D3D9.h: LPDIRECT3DPIXELSHADER9 o PDIRECT3DPIXELSHADER9.