在Linux上使用C ++,我只是愚蠢地写了这个:
struct in_addr ip_addr = ((struct sockaddr_in)socket_addr).sin_addr;
取代预期:
struct in_addr ip_addr = ((struct sockaddr_in*)&socket_addr)->sin_addr;
给我这个错误:
"error: no matching function for call to ‘sockaddr_in::sockaddr_in(sockaddr&)"
我知道为什么我有错误(我试图构建一个结构),但我不明白为什么错误信息会说明它的作用。有人可以解释一下吗?
答案 0 :(得分:4)
当对类型(而不是指针)进行强制转换时,编译器会尝试调用sockaddr_in
的构造函数,该构造函数采用与socket_addr
相同类型的对象。由于该构造函数不存在,编译器会抛出您显示的错误。
答案 1 :(得分:4)
当编译器遇到C风格的演员表it tries to interpret it as one or two C++-style casts时,按以下顺序:
const_cast<new_type>(expression)
static_cast<new_type>(expression)
static_cast (with extensions)
后跟const_cast
reinterpret_cast<new_type>(expression)
reinterpret_cast
后跟const_cast
选择满足相应演员的要求的第一个选项,即使它无法编译。
在您的情况下,选择了static_cast<sockaddr_in>(socket_addr)
。这是direct initialization,因此编译器会查找并找不到对正在转换的对象进行const
引用的构造函数。
请注意,相同的转换在应用于指针时不会触发错误,因为语言在不同类型的指针之间具有内置转换。
答案 2 :(得分:2)
因为演员如何运作 - 他们将A
转换为B
,并且(除非B
是指针或引用)需要调用转换运算符或构造函数。编译器正在尝试查找构造函数以从sockaddr_in
创建sockaddr
;不存在,因此错误。
它无法猜测你真的打算尝试转换为别的东西。
我发现很大一部分成为高效的C ++程序员正在学习采用这些编译器错误并使用它们启发式地确定实际问题可能是什么的艺术。 ;)