Static_cast 没有匹配的调用函数
Static_cast no matching function for call
你能解释一下 static_cast 的工作吗?
为什么此代码不起作用?
D another_d = static_cast<D>(br); // ERROR - no matching function for call to ‘D::D(B&)’
我的代码
#include <bits/stdc++.h>
using namespace std;
struct B {
int m = 0;
void hello() const {
std::cout << "Hello world, this is B!\n";
}
};
struct D : B {
void hello() const {
std::cout << "Hello world, this is D!\n";
}
};
int main(){
D d;
B br = d; // upcast via implicit conversion
br.hello(); // Hello world, this is B!
// D another_d = static_cast<D>(br); // ERROR - no matching function for call to ‘D::D(B&)’
D& another_d = static_cast<D&>(br); // OK
another_d.hello(); // Hello world, this is D!
}
B br = d; // upcast via implicit conversion
这是object slicing。 br
是 B
的实例,仅复制 d
的 B
部分。 (这意味着编译器可以隐式地将 d
向下转换为 B&
,因为 D
派生自 B
。)
D another_d = static_cast<D>(br);
这是尝试从 B
的实例创建 D
的实例。
虽然 D
也是 B
(由于继承),但反之则不然。
因此,编译器无法隐式执行任何操作。
要使其正常工作,必须定义一个构造函数 D(B&)
。
为了说明这一点:D
可能有无法从 B
复制的其他成员变量,这是此类构造函数必须以任何方式处理的内容。
D& another_d = static_cast<D&>(br); // OK
这不太行。它可能(似乎)起作用,因为 D
不包含其他成员变量。
br
是 B
的实例(不是 D
的实例)。 “伪造”对 D
的引用实际上是一个谎言,但明确地(在代码中)这样做会使编译器保持沉默。然而,还是错了。
你能解释一下 static_cast 的工作吗?
为什么此代码不起作用?
D another_d = static_cast<D>(br); // ERROR - no matching function for call to ‘D::D(B&)’
我的代码
#include <bits/stdc++.h>
using namespace std;
struct B {
int m = 0;
void hello() const {
std::cout << "Hello world, this is B!\n";
}
};
struct D : B {
void hello() const {
std::cout << "Hello world, this is D!\n";
}
};
int main(){
D d;
B br = d; // upcast via implicit conversion
br.hello(); // Hello world, this is B!
// D another_d = static_cast<D>(br); // ERROR - no matching function for call to ‘D::D(B&)’
D& another_d = static_cast<D&>(br); // OK
another_d.hello(); // Hello world, this is D!
}
B br = d; // upcast via implicit conversion
这是object slicing。 br
是 B
的实例,仅复制 d
的 B
部分。 (这意味着编译器可以隐式地将 d
向下转换为 B&
,因为 D
派生自 B
。)
D another_d = static_cast<D>(br);
这是尝试从 B
的实例创建 D
的实例。
虽然 D
也是 B
(由于继承),但反之则不然。
因此,编译器无法隐式执行任何操作。
要使其正常工作,必须定义一个构造函数 D(B&)
。
为了说明这一点:D
可能有无法从 B
复制的其他成员变量,这是此类构造函数必须以任何方式处理的内容。
D& another_d = static_cast<D&>(br); // OK
这不太行。它可能(似乎)起作用,因为 D
不包含其他成员变量。
br
是 B
的实例(不是 D
的实例)。 “伪造”对 D
的引用实际上是一个谎言,但明确地(在代码中)这样做会使编译器保持沉默。然而,还是错了。