2010-01-08 7 views
6

¿Las bibliotecas streflop o boost cambian la definición de std :: min?std :: min se está redefiniendo, pero ¿cómo?

que tienen un proyecto que compila bien con g ++/hacer HASTA QUE fusionarla con la CMake construir de otro proyecto (utilizando add_directory). De repente me sale:

número
no matching function for call to min(double&,float) 

La línea que dice que el error está en que está mal (está apuntando a la última línea del archivo de origen) pero voy a asumir el código en cuestión es la siguiente:

first = std::min (first, key.mTime); 

Donde primero se declara como un doble.

El proyecto 'padre' (Primavera RTS) utiliza impulso y streflop pero incluso después de reemplazar toda incluye, por <math.h> con "streflop_cond.h" en el proyecto secundario (assimp) el problema permanece.

Tal vez algunas opciones del compilador son responsables, no estoy seguro. Una teorías serían apreciadas. La fuente para ambos proyectos está disponible en línea.

He pasado casi 7 horas en esto ahora y no me parece más cerca de una solución.

El error completo y construir banderas es:

[ 61%] Building CXX object rts/lib/assimp/code/CMakeFiles/assimp.dir/ScenePreprocessor.cpp.o 
cd /mnt/work/workspace/spring-patch-git/linux/build/rts/lib/assimp/code && /usr/bin/g++ -Dassimp_EXPORTS -DSYNCCHECK -DNO_AVI -DSPRING_DATADIR=\"/usr/local/share/games/spring\" -DSTREFLOP_SSE -DASSIMP_BUILD_DLL_EXPORT -msse -mfpmath=sse -fsingle-precision-constant -frounding-math -mieee-fp -pipe -fno-strict-aliasing -fvisibility=hidden -fvisibility-inlines-hidden -pthread -O0 -Wall -Wno-sign-compare -DDEBUG -D_DEBUG -DNO_CATCH_EXCEPTIONS -gstabs -fPIC -I/mnt/work/workspace/spring-patch-git/spring/rts/System -I/mnt/work/workspace/spring-patch-git/spring/rts/lib/lua/include -I/mnt/work/workspace/spring-patch-git/spring/rts/lib/streflop -I/usr/include/SDL -I/usr/include/boost-1_39 -I/mnt/work/workspace/spring-patch-git/spring/rts -I/usr/include/AL -I/usr/include/freetype2 -I/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/include -I/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/../streflop -o CMakeFiles/assimp.dir/ScenePreprocessor.cpp.o -c /mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/ScenePreprocessor.cpp 
/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/ScenePreprocessor.cpp: In member function void Assimp::ScenePreprocessor::ProcessAnimation(aiAnimation*): 
/mnt/work/workspace/spring-patch-git/spring/rts/lib/assimp/code/ScenePreprocessor.cpp:280: error: no matching function for call to min(double&, float) 
make[2]: *** [rts/lib/assimp/code/CMakeFiles/assimp.dir/ScenePreprocessor.cpp.o] Error 1 
+0

¿No puedes hacer un nuevo archivo fuente con los mismos '' include's y using's y vuelva a comprobar? – Potatoswatter

Respuesta

7

Trate

std::min<double>(first, key.mTime); 

Los dos argumentos parecen tener diferentes tipos por lo que el compilador no puede resolver el argumento de plantilla para std::min

EDIT3: De hecho, eché un vistazo a la biblioteca de assimp y de su mensaje de error, es la línea 28 0 de ScenePreprocessor.cpp que es la causa de los problemas:

anim->mDuration = last - std::min(first, 0.); 

No hay nada de malo en esta línea, sin embargo, first se declara como un doble y un doble 0. significa literalmente cero.

Supongo que el problema radica en la biblioteca STREFLOP, parece que está interpretando incorrectamente 0. como un literal flotante.

+1

O '', que probablemente se desee aquí. –

+0

@Roger Gracias, actualizado –

+0

Solo una suposición, pero puede ser que el código que define mTime dependa de un símbolo de preprocesador para decidir si usar flotantes o dobles. Las opciones del compilador pueden definir este símbolo de manera diferente en los dos casos. –

0

Podría este error se relaciona con min() siendo una plantilla y esperando parámetros que ser del mismo tipo? El mensaje de error sugiere que está poniendo double y float en él.
Si bien esto no responde a su pregunta si se redefine min(), puede ayudar con el problema de compilación.

Cuestiones relacionadas