2015-07-07 2 views
1

Я сталкиваюсь с ошибкой компиляции при попытке статического использования аргумента внутри ускорителя феникса lambda. Ошибки сами слишком длинны, поэтому я отправил их в pastebin here.boost :: phoenix :: static_cast_ compile errors

Я создал минимальный пример, показывающий, что я пытаюсь сделать. Если я сделаю переменную b в указателе A и, следовательно, не произнесет, тогда все будет компилироваться и запускаться правильно. Кто-нибудь знает, почему это происходит?

Минимальный пример (компилировать с "звоном ++ -lboost_thread phoenix_test.cpp"):

#include <boost/phoenix.hpp> 
#include <iostream> 

using namespace boost; 
using namespace phoenix; 
using namespace arg_names; 
using namespace local_names; 

class A 
{ 
public: 
    A(int a) 
     : mA(a) 
    {}; 
    int GetX() const {return mA;}; 
protected: 
    int mA; 
}; 

class B : public A 
{ 
public: 
    B(int a) 
     : A(a) 
    {}; 
    int GetX() const { return mA + 1; } 
}; 

int main (void) 
{ 
    const A* a = new A(3); 
    const A* b = new B(2); 
    BOOST_AUTO(test, (_1->*&A::GetX)() + (static_cast_<const B*>(_2)->*&B::GetX)()); 

    std::cout << test(a, b) << std::endl; 
    delete a; 
    delete b; 
    return 0; 
} 

Компилятор использовали лязг 3.4 и GCC 4.6.3 также пытались.

+0

по электронной почте Ой. Вы скомпилировали правильный образец? [Ваш код компилируется] (http://coliru.stacked-crooked.com/a/8429237e1ff4840f) и только ссылки на ошибки 'dynamic_cast' – sehe

+0

Вы правы - я скомпилировал неправильный образец. Тем не менее, я все еще получаю ошибки компиляции при компиляции с static_cast_. [Здесь] (http://pastebin.com/raw.php?i=bjLaSrHe) - сообщение компилятора для статического броска. – Lejar

ответ

0

Сообщения об ошибках, похоже, подразумевают, что вы использовали dynamic_cast_.

Динамические броски требуют виртуальных классов. Добавление виртуального члена базового класса (например, деструктор)

Пример:

Live On Coliru

#include <boost/phoenix.hpp> 
#include <iostream> 

namespace px = boost::phoenix; 
using namespace px::arg_names; 
using namespace px::local_names; 

class A { 
    public: 
     virtual ~A() {} 
     A(int a) : mA(a){}; 
     int GetX() const { return mA; }; 

    protected: 
     int mA; 
}; 

class B : public A { 
    public: 
     B(int a) : A(a){}; 
     int GetX() const { return mA + 1; } 
}; 

int main() 
{ 
    const A* a = new A(3); 
    const A* b = new B(2); 
    BOOST_AUTO(test, (_1->*&A::GetX)() + (px::dynamic_cast_<const B*>(_2)->*&B::GetX)()); 

    std::cout << test(a, b) << std::endl; 
    delete a; 
    delete b; 
    return 0; 
} 

Печать

6 
+0

Я все еще получаю ошибки с clang ++ 3.4. Какой компилятор/версия вы используете? – Lejar

+0

Ошибки компилятора, которые я получил при компиляции вашего примера [здесь] (http://pastebin.com/raw.php?i=P01Xjgey) – Lejar

+0

@Lejar mmm. это очень странно. Вы заметили, что я добавил деструктор (IOW: вы действительно скопировали код?) – sehe