2013-04-25 5 views
0

Это очень простой вопрос, который меня озадачивает.Невозможно найти sin (double), sin (double &), cos (double), cos (double &)

Я получаю следующее сообщение об ошибке (ы) для одного исходного файла, но не другой:

4 src/Source2.cpp:1466: error: no matching function for call to ‘cos(double&)’ 
5 src/Source2.cpp:1466: error: no matching function for call to ‘sin(double)’ 
6 src/Source2.cpp:1467: error: no matching function for call to ‘sin(double&)’ 
7 src/Source2.cpp:1467: error: no matching function for call to ‘sin(double)’ 
8 src/Source2.cpp:1468: error: no matching function for call to ‘cos(double)’ 
9 src/Source2.cpp:1479: error: no matching function for call to ‘cos(double&)’ 
10 src/Source2.cpp:1479: error: no matching function for call to ‘sin(double)’ 
11 src/Source2.cpp:1480: error: no matching function for call to ‘sin(double&)’ 
12 src/Source2.cpp:1480: error: no matching function for call to ‘sin(double)’ 
13 src/Source2.cpp:1481: error: no matching function for call to ‘cos(double)’ 

Что странно, так как я Header1.hpp/Source1.cpp работает, но Header2.hpp/Source2.cpp не работает. Разница между ними заключается в том, что Source2 использует «удваивает», а Source1 использует «float», но при произнесении те же ошибки, что и выше, «sin (float)» или «cos (float)».

Я думаю, что я связываю математическую библиотеку, так как другой источник (такая же программа) работает и не жалуется.

Любые советы ценится =)

Спасибо заранее!

фрагменты кода:

Header1.hpp:

4 #include <iostream> 
5 
6 #include <stdio.h> 
7 #include <math.h> 
8 #include <ctime> 
9 
10 #define GL_GLEXT_PROTOTYPES 
11 
13 #include <OpenGL/gl.h> 
14 #include <GLUT/glut.h> 

Source1.cpp:

123 aim[0] = cos(camTheta)*sin(camPhi); 
124 aim[1] = sin(camTheta)*sin(camPhi); 
125 aim[2] = cos(camPhi); 
126 
127 up[0] = cos(camTheta)*sin(camPhi - pih); 
128 up[1] = sin(camTheta)*sin(camPhi - pih); 
129 up[2] = cos(camPhi - pih); 

Header2.hpp:

4 #include <algorithm> 
5 #include <iostream> 
6 #include <fstream> 
7 #include <sstream> 
8 #include <vector> 
9 #include <cmath> 
. . . 
25 #define pih (M_PI/2.0) 
26 #define pi M_PI 
27 #define pi2 (2.0*M_PI) 

Source2.cpp:

1453 double theta, phi; 
1454 double x, y, z; 
. . . 
1464  node(n,0) = cos(theta)*sin(phi - pih); 
1465  node(n,1) = sin(theta)*sin(phi - pih); 
1466  node(n,2) = cos(phi - pih); 
+0

Так что Source2.cpp включает в себя либо Header1.hpp, либо Header2.hpp (или что-нибудь еще)? – john

+0

Да, каждый включает соответствующий заголовок сверху. Source2 включает только Header2, аналогичный Source1 – Yuuta

+0

Вам следует попытаться быть последовательным re. 'math.h' против' cmath'. Если вы соглашаетесь на 'cmath', тогда добавьте' std :: 'к этим функциям. – juanchopanza

ответ

2

Заголовок <math.h> помещает свои имена в глобальное пространство имен. Заголовок <cmath> помещает свои имена в пространство имен std. (Каждому разрешено также помещать имена в другое пространство имен). Когда код использует <math.h>, способ вызова функции sin - sin(theta). Когда код использует <cmath>, способ вызова функции sin - std::sin(theta) (если только код не использует мерзость using namespace std). В Source2.cpp директива #include тянет <cmath>, поэтому файл должен использовать квалифицированное имя, а не необработанное имя. Или измените директиву #include, чтобы вытащить <math.h>, что и делает Source1.cpp.

+0

Ничего себе, это исправлено! Я не знал этого, спасибо =) Это не позволяет мне отметить его в течение 9 минут, я сделаю это по истечении срока – Yuuta

+0

@Yuuta - это общий шаблон: C заголовки заканчиваются на '.h', а соответствующий заголовок C++ начинается с 'c' и не имеет расширения. Заголовки C помещают имена в глобальное пространство имен (и, возможно, в 'std'), а заголовки C++ помещают имена в' std' (и, возможно, в глобальное пространство имен). –

+0

Удивительный, спасибо за дополнительное объяснение. У меня еще есть чему поучиться хаха – Yuuta

0

Добавить -lm для "libm" (m = math) на вашу ссылку.

+0

Спасибо за быстрый ответ, я уже связываю математическую библиотеку. – Yuuta

Смежные вопросы