我正在将一些代码从Visual studio移植到mingw。在解决了一些问题后,我将解决以下问题。我收到了错误
error: no matching function for call to 'DataU::DataU(const char [1])'
static const DataU NAN = {0x7fc00000};
^
这是我正在使用的代码
static const DataU NAN = {0x7fc00000};
这是数据结构
union DataU {
uint32_t u;
float f;
};
我对工会没有太多经验,但我从here
获得了基础知识我仍然感到困惑的是,为什么我在GCC中收到此错误的错误。
static const DataU NAN = {0x7fc00000};
据我所知,应该调用DataU的拷贝构造函数。但是,该联合没有自定义复制构造函数。
这是C ++ 03,我不明白为什么{}
在这里使用。关于如何解决这个问题的任何建议都将不胜感激。
更新 我真的不确定我从哪里得到这个错误。但是我希望这个输出有助于解决问题
: error: no matching function for call to 'kt_flash::DataU::DataU(const char [1])'
static const DataU NAN = {0x7fc00000};
^
C:\Users\admin\kflash.cpp:55:20: note: candidates are:
C:\Users\admin\kflash.cpp:11:7: note: kt_flash::DataU::DataU()
union DataU {
^
C:\Users\admin\kflash.cpp:11:7: note: candidate expects 0 arguments, 1 provided
C:\Users\admin\kflash.cpp:11:7: note: constexpr kt_flash::DataU::DataU(const kt_flash::DataU&)
C:\Users\admin\kflash.cpp:11:7: note: no known conversion for argument 1 from 'const char [1]' to 'const kt_flash::DataU&'
C:\Users\admin\kflash.cpp:11:7: note: constexpr kt_flash::DataU::DataU(kt_flash::DataU&&)
C:\Users\admin\kflash.cpp:11:7: note: no known conversion for argument 1 from 'const char [1]' to 'kt_flash::DataU&&'
C:\Users\admin\kflash.cpp:55:25: error: expected ',' or ';' before '=' token
static const DataU NAN = {0x7fc00000};
^
In file included from C:/mingw64/x86_64-w64-mingw32/include/d3dx9math.h:26:0,
from C:/mingw64/x86_64-w64-mingw32/include/d3dx9.h:31,
from C:/mingw64/x86_64-w64-mingw32/include/d3dx9math.h:21,
from ./ktafx.h:36,
from <command-line>:0:
C:\Users\admin\kflash.cpp:59:25: error: no match for call to '(const kt_flash::DataU) (const char [1])'
const float FLOAT_NAN = NAN.f;
^
Process terminated with status 1 (0 minute(s), 7 second(s))
3 error(s), 3 warning(s) (0 minute(s), 7 second(s))
答案 0 :(得分:3)
这是一个初始化者,而不是作业。
在初始化程序中:
static const DataU NAN = {0x7fc00000};
值0x7fc00000
初始化第一个声明的联合成员 - 在本例中为u
。
这在C ++标准N4296草案的第8.5.1节[dcl.init.aggr]第16节中有详细说明:
当使用大括号括起初始化器初始化union时, 大括号只能包含第一个 initializer-clause 联盟的非静态数据成员。
我希望标准的其他版本中也有相同的措辞(以及C标准中的类似措辞)。
但我认为错误消息的原因是您使用标识符NAN
。这是<cmath>
或<math.h>
中定义的宏;它扩展为表示浮点NaN(非数字)的表达式。更改标识符可能会解决问题。 (而且我看到[AnT&#39;(https://stackoverflow.com/a/29357570/827263)在我做之前提到了这一点。)
答案 1 :(得分:3)
您的代码在语法和语义上一见钟情。但是,NAN
是math.h
中定义的标准C宏。这就是它引发奇怪错误的原因。您不应该在代码中使用此名称。
如果NAN
被其他名称替换,则代码可以通过GCC编译。但是,一旦您将其称为NAN
并包含cmath
(或math.h
),就会触发错误。在我的实验中,错误信息虽然不同。
将名称从NAN
更改为其他内容。