«dynamic_cast» не допускается с -fno-rtti
class A {
virtual ~A();
}
class B : public A {
public:
int foo;
}
void bar(A *foo_){
B* b = dynamic_cast<B*>(foo_);
if(b != nullptr){
cout << (*foo_)->foo << endl;
}
}
int main(){
B b{};
bar(b);
}
Ошибка компиляции:
error: 'dynamic_cast' not permitted with -fno-rtti
Я искренне благодарю за помощь.
1 ответ
Лучший ответ:
Похоже, avr-gcc версии 4.9.2, используемый Arduino IDE, был скомпилирован без поддержки RTTI. По умолчанию он имеет значение -fno-rtti
, и если вы попытаетесь включить его с помощью -frtti
, то вместо этого получите другие ужасные сообщения об ошибках компоновщика.
Похоже, вы не можете использовать dynamic_cast
на платах AVR.
Погуглив, я понял, что множество людей пытались включить FTTI на Arduino, но они либо потерпели неудачу и сдались, либо добились успеха, но так и не удосужились рассказать кому-либо еще, как им это удалось (многочисленные сообщения на форуме «как это сделать?», небольшое обсуждение, а затем все стихло...)
Решение? Либо не использовать RTTI, либо использовать более производительный микроконтроллер, компилятор которого поддерживает RTTI.
Один из способов не использовать RTTI — это имитировать его самостоятельно:
#define CLASS_A 1
#define CLASS_B 2
class A {
public:
virtual int classType() { return CLASS_A; }
};
class B : public A {
public:
virtual int classType() { return CLASS_B; }
void bar() {
Serial.println("Baaaah!");
}
};
void foo(A *foo) {
if (foo->classType() == CLASS_B) {
B *foob = (B *)foo;
foob->bar();
} else {
Serial.println("Sorry, I can't bar.");
}
}
void setup() {
Serial.begin(115200);
A a;
B b;
foo(&a);
foo(&b);
}
void loop() {
}
Выход:
Sorry, I can't bar.
Baaaah!
Вы дали решение в виде пластыря. Оно уже годно., @Bruno Henrique Peixoto
- Как компилировать, загружать и контролировать через командную строку Linux?
- Предупреждение при проверке скетча с кодом VS
- Компиляция идет медленно
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Есть ли способ загрузить предварительно скомпилированный код в Arduino?
- Как загрузить уже скомпилированный код, когда никаких изменений не производилось?
- Установка timer3 в режиме CTC - конфликт с сервобиблиотекой
Для какой платы вы пытаетесь скомпилировать?, @Majenko
Ардуино Мега2560, @Bruno Henrique Peixoto
Какая у вас версия IDE и версия пакета плат?, @Majenko
PlatformIO и arduino-1.8.5, @Bruno Henrique Peixoto