2010-01-08 7 views
6

Czy biblioteki streflop lub boost zmieniają definicję std :: min?std :: min jest na nowo definiowany, ale jak?

Mam projektu, który kompiluje dobrze z g ++/make UNTIL scalam go z CMake kompilacji innego projektu (przy użyciu add_directory). Nagle pojawia się:

liczba
no matching function for call to min(double&,float) 

Linia twierdzi, błąd jest na jest źle (to wskazując na ostatniej linii pliku źródłowego), ale mam zamiar założyć odpowiedni kod jest taka:

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

Gdzie pierwsza jest zadeklarowana jako podwójna.

Projekt "nadrzędny" (Spring RTS) wykorzystuje boost i streflop, ale nawet po wymianie wszystkich załączników dla <math.h> z "streflop_cond.h" w projekcie potomnym (assimp) problem pozostaje.

Może niektóre flagi kompilatora są odpowiedzialne, nie jestem pewien. Docenione zostaną teorie. Źródło obu projektów jest dostępne online.

Spędziłem prawie 7 godzin nad tym i nie wydaje mi się bliższy rozwiązania.

pełnej błędów i budować flagi to:

[ 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

Nie możesz utworzyć nowego pliku źródłowego z tymi samymi 'include's i' using's i double-check? – Potatoswatter

Odpowiedz

7

Spróbuj

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

Oba argumenty wydają się mieć różne rodzaje więc kompilator nie może rozwiązać argument szablonu do std::min

EDIT3: Właściwie rzuciłem okiem na bibliotekę assimp i z twojego komunikatu o błędzie, to jest linia 28 0 ScenePreprocessor.cpp to jest przyczyną problemów:

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

Nie ma nic złego w tym wierszu jednak first jest zadeklarowana jako podwójne i 0. oznacza zero podwójne dosłowne.

Domyślam się, że problem leży w bibliotece STREFLOP, wygląda na to, że nieprawidłowo interpretuje ona 0. jako literał float.

+1

Lub '', co jest prawdopodobnie pożądane tutaj. –

+0

@Roger Dzięki, zaktualizowany –

+0

Po prostu zgadnij, ale może być tak, że kod definiujący mTime opiera się na symbolu preprocesora, aby zdecydować, czy użyć funkcji pływających czy podwójnych. Opcje kompilatora mogą w różny sposób definiować ten symbol w dwóch przypadkach. –

0

Czy ten błąd może być związany z tym, że min() jest szablonem i oczekuje, że parametry będą tego samego typu? Komunikat o błędzie sugeruje umieszczenie w nim double i float.
Chociaż to nie odpowiada na pytanie, czy min() jest przedefiniowane, może pomóc w problemie kompilacji.

Powiązane problemy