将 {0x7fc00000} 之类的东西分配给联合意味着什么?
What does assigning something like {0x7fc00000} to a union mean?
我正在将一些代码从 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))
那是初始化程序,不是赋值。
在初始化程序中,例如:
static const DataU NAN = {0x7fc00000};
值 0x7fc00000
初始化 第一个 声明的联合成员——在本例中,u
.
C++ 标准 N4296 草案第 8.5.1 [dcl.init.aggr] 节第 16 段中指定:
When a union is initialized with a brace-enclosed initializer, the
braces shall only contain an initializer-clause for the first
non-static data member of the union.
我希望标准的其他版本中有相同的措辞(C 标准中也有类似的措辞)。
但我认为错误消息的原因是您使用了标识符 NAN
。那是在<cmath>
或<math.h>
中定义的宏;它扩展为表示浮点 NaN(非数字)的表达式。更改标识符可能会解决问题。 (而且我看到 [AnT 的回答'() 在我之前提到了这一点。)
乍一看,您的代码在语法和语义上都很好。但是,NAN
是在 math.h
中定义的标准 C 宏。这就是它触发奇怪错误的原因。你不应该在你的代码中使用这个名字。
如果 NAN
被其他名称替换,GCC 可以很好地编译代码。但是一旦你调用它 NAN
并包含 cmath
(或 math.h
),它就会触发错误。在我的实验中,错误信息是不同的。
将名称从 NAN
更改为其他名称。
我正在将一些代码从 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))
那是初始化程序,不是赋值。
在初始化程序中,例如:
static const DataU NAN = {0x7fc00000};
值 0x7fc00000
初始化 第一个 声明的联合成员——在本例中,u
.
C++ 标准 N4296 草案第 8.5.1 [dcl.init.aggr] 节第 16 段中指定:
When a union is initialized with a brace-enclosed initializer, the braces shall only contain an initializer-clause for the first non-static data member of the union.
我希望标准的其他版本中有相同的措辞(C 标准中也有类似的措辞)。
但我认为错误消息的原因是您使用了标识符 NAN
。那是在<cmath>
或<math.h>
中定义的宏;它扩展为表示浮点 NaN(非数字)的表达式。更改标识符可能会解决问题。 (而且我看到 [AnT 的回答'(
乍一看,您的代码在语法和语义上都很好。但是,NAN
是在 math.h
中定义的标准 C 宏。这就是它触发奇怪错误的原因。你不应该在你的代码中使用这个名字。
如果 NAN
被其他名称替换,GCC 可以很好地编译代码。但是一旦你调用它 NAN
并包含 cmath
(或 math.h
),它就会触发错误。在我的实验中,错误信息是不同的。
将名称从 NAN
更改为其他名称。