우리는 보통의 클래스 계층이 있습니다함수 포인터가 대체 가능성을 깨고 std :: function이 중단되는 이유는 무엇입니까?
class B
{
public:
int x;
B() : x(0) {}
virtual ~B() {}
};
class D : public B
{
public:
int y;
D() : y(0) {}
};
그리고 하나 개의 인자를받는 함수를 - 기본 클래스 객체에 대한 참조를.
void b_set(B& b)
{
b.x = 5;
}
그런 다음, I 형 void (D&)
의 함수 포인터를 만들고 그 안에 b_set
을 저장할. 함수 호출 포인터에 합법적으로 전달 된 모든 객체는 유형 B 여야하므로 유효한 연산이어야합니다. 그러나 허용되지 않습니다.
typedef void (*fp_d_mutator)(D&);
void fp_test(D& obj)
{
fp_d_mutator fun = b_set; //invalid conversion from 'void (*)(B&)' to 'fp_d_mutator {aka void (*)(D&)}
fun(obj);
}
#include <functional>
typedef std::function<void (D&)> stdfun_d_mutator;
void stdfun_test(D& obj)
{
stdfun_d_mutator fun = b_set; //works
fun(obj);
}
그래서 ...
- 방법은 유효하지 않은 변환입니까?
- 왜 변환이 잘못 되었습니까?
- 허용 된 경우 무엇이 중단 될 수 있습니까?
- 어떻게 std :: function이 문제를 처음부터 피할 수 있습니까?
이 Cheersandhth. - 알프 @ –
에 적용 g ++ 4.7.2는 MinGW – milleniumbug
흠, 맞아 thinko, SRY –