2

出于某种原因,我收到以下警告

filename.cpp:99:53: warning: narrowing conversion of ‘sin(((double)theta))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]
filename.cpp:99:66: warning: narrowing conversion of ‘cos(((double)theta))’ from ‘double’ to ‘float’ inside { } [-Wnarrowing]

这听起来像是在尝试使用“double cos(double)”等而不是“float cos(float)”等。我一直在尝试想更多的方法来向编译器提出这个建议,但没有得到任何结果。我能做些什么来解决这个问题?

void foo(float theta)
{
    theta = (float)M_PI*theta/180.0f;
    MyClass variable = { 1.0f,    0.0f,         0.0f,   0.0f,
                         0.0f, cos(theta), -sin(theta), 0.0f,
                         0.0f, sin(theta),  cos(theta), 0.0f,
                         0.0f,     0.0f,        0.0f,   1.0f };
    bob = variable;
}

谢谢


编辑:将其更改为此会使警告消失,但我仍然想知道问题出在哪里

float C = cos(theta), S = sin(theta);
MyClass variable = { 1.0f,    0.0f,         0.0f,   0.0f,
                 0.0f, C, -S, 0.0f,
                 0.0f, S,  C, 0.0f,
                 0.0f,     0.0f,        0.0f,   1.0f };
4

4 回答 4

3

您需要使用std::sinstd::cos代替sinandcos以便获得正确重载的版本。您可以现场看到差异:

MyClass variable = { 1.0f,    0.0f,         0.0f,   0.0f,
                     0.0f, std::cos(theta), -std::sin(theta), 0.0f,
                     0.0f, std::sin(theta),  std::cos(theta), 0.0f,
                     0.0f,     0.0f,        0.0f,   1.0f };

C 库中的函数是否首先在全局命名空间中声明是未指定的行为,C++ 草案标准部分标题4段说(强调我的):17.6.1.2

除了第 18 到 30 条和附录 D 中的说明外,每个头文件 cname 的内容应与相应的头文件 name.h 的内容相同,如 C 标准库 (1.2) 或 C Unicode TR 中规定的,视情况而定,好像通过包含。然而,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在命名空间 std 的命名空间范围 (3.3.6) 内。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明(7.3.3)注入命名空间 std 。

因此,如果C 库函数位于全局命名空间中,您将获得cos只需要doublesin版本,这与我们所看到的行为一致。

于 2013-10-01T18:55:24.387 回答
1

看起来您正在使用 sin/cos 的 C 版本。很难说为什么没有额外的信息,但修复可能是使用 C 函数 sinf/cosf 或确保 std::sin() 使用 C++ 函数。

于 2013-10-01T18:55:57.217 回答
0

库中的cosand接受 double 作为参数。该警告试图告诉您您正在给它 a并且它必须将其转换为sincmathfloatdouble

函数的std版本是重载的,但是如果你想使用它们,你必须像这样使用它们的命名空间来调用它们std::cos

于 2013-10-01T18:51:03.437 回答
0

编译器抱怨您在期望双精度的地方使用浮点数。您可以显式地转换每个使用,也可以只创建一个本地双精度。

我会重写你的例子如下:

void foo(float theta)
{
    double rad = (double)M_PI*theta/180.0f;
    MyClass variable = { 1.0f,    0.0f,     0.0f,   0.0f,
                         0.0f, cos(rad), -sin(rad), 0.0f,
                         0.0f, sin(rad),  cos(rad), 0.0f,
                         0.0f,     0.0f,    0.0f,   1.0f };
    bob = variable;
}
于 2013-10-01T18:51:56.153 回答