«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

Я искренне благодарю за помощь.

, 👍0

Обсуждение

Для какой платы вы пытаетесь скомпилировать?, @Majenko

Ардуино Мега2560, @Bruno Henrique Peixoto

Какая у вас версия IDE и версия пакета плат?, @Majenko

PlatformIO и arduino-1.8.5, @Bruno Henrique Peixoto


1 ответ


Лучший ответ:

2

Похоже, 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