Затмение полиморфизм с использованием ошибки C++11 shared_ptr

Учитывая следующий пример кода:

#include <iostream>
#include <memory>
using namespace std;

struct A {
public:
    A(int aa) : a(aa) {}
    int a;
    virtual ~A() {}
};
struct B : A {
public:
    B(int aa, int bb) : A(aa), b(bb) {}
    int b;
};

void f(shared_ptr<A> a){
    shared_ptr<B> b = dynamic_pointer_cast<B>(a);
    if (b) {
        cout << b->b << endl;
    } else {
        cout << a->a << endl;
    }
}

int main() {
    auto a = make_shared<A>(3);
    auto b = make_shared<B>(7, 4);
    f(a);
    f(b);
    return 0;
}

Затмение указывает, что на линии произошла ошибка

f(b);

поговорка Invalid arguments ' Candidates are: void f(std::shared_ptr<A>) '
потому что shared_ptr<B> был пройден. Это компилирует и запускает, и имеет вывод:

3
4

как и ожидалось.

В индексаторе и компиляторе указано -std= C++11.
Компилятор также имеет символ __GXX_EXPERIMENTAL_CXX0X__ определены.

Есть ли какой-нибудь способ избавиться от этой ошибки и ее красных загогулинов в Eclipse (желательно без изменения источника)?

2 ответа

Решение

Это было исправлено в более поздних версиях CDT (я только что попробовал).

Вы можете использовать ночную сборку CDT, используя этот репозиторий: перейдите в справку и введите URL http://download.eclipse.org/tools/cdt/builds/kepler/nightly

Если вам не хочется использовать спокойную сборку, вы должны по крайней мере убедиться, что у вас установлена ​​последняя выпущенная версия (на момент написания статьи это 8.1.1), используя http://download.eclipse.org/tools/cdt/releases/juno/

Моя полная настройка Eclipse с C++11 находится здесь: http://scrupulousabstractions.tumblr.com/post/36441490955/eclipse-mingw-builds

Я рекомендую отключить плагин Codan для статического анализа кода в настройках, которые он, вероятно, еще не поддерживает C++11.

Другие вопросы по тегам