Я столкнулся с проблемой неявного преобразования в С++. Ниже приведен минимальный пример:
struct A {
virtual void f()=0; // abstract
};
struct Ad : A {
virtual void f() {} // not abstract
};
struct B {
operator Ad () const { return Ad(); }
};
void test(A const &lhs) {}
int main()
{
B b;
test(b);
}
То, что я хотел бы сделать компилятору: конвертировать b в переменную типа Ad (используя преобразование, определенную в B), и передать результат для проверки. Однако приведенный выше код не компилируется в GCC (с включенным С++ 11), результат не может выделить объект абстрактного типа "A".
Некоторые примечания:
- Clang компилирует это.
- Если вы делаете A не абстрактным, изменяя
f()=0;
наf() {}
, код работает очень хорошо. - Компилятор находит оператор преобразования (как указано 2), но он не делает того, что я хотел бы сделать.