2012-05-17 3 views
2

Ну, это мой первый опыт работы с лямбдой, и я знаю, что я могу злоупотреблять этой функцией, но мне интересно, почему я должен получить ошибку компиляции?C++ lambda error: нет подходящего конструктора по умолчанию

GameMap::MoveDirection AIPlayer::getSafeRouteTo(const GameMap::PlayerInfo& s, const Point& e) 
{ 
    struct node : public Point 
    { 
     GameMap::MoveDirection parent; 
     float d; 
     node():Point(){}; 
     node(Point p) : Point(p) 
     { 
     }; 
    }; 
    auto lambdaFunction = [this,&e](node&left,node&right)->bool 
    { 
     return this->getDistance(left,e) + left.d < this->getDistance(right,e) + right.d; 
    }; 
    priority_queue<node,vector<node>, decltype(lambdaFunction)> Q; 
    //do stuff 
    return GameMap::MD_None; 
} 

и ради аргумента, позвольте мне сказать, что MoveDirection это перечисление, и точка имеет конструктор по умолчанию. как я прокомментировал, удалив эту конкретную строку, я не получаю ошибку, но мне действительно нужно, чтобы она была там. вот ошибки, которые генерирует VC2010:

d:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(225): error C2512: '`anonymous-namespace'::<lambda0>' : no appropriate default constructor available 
1>   d:\program files (x86)\microsoft visual studio 10.0\vc\include\queue(223) : while compiling class template member function 'std::priority_queue<_Ty,_Container,_Pr>::priority_queue(void)' 
1>   with 
1>   [ 
1>    _Ty=AIPlayer::getSafeRouteTo::node, 
1>    _Container=std::vector<AIPlayer::getSafeRouteTo::node>, 
1>    _Pr=`anonymous-namespace'::<lambda0> 
1>   ] 
1>   c:\users\ali\documents\visual studio 2010\projects\bokhorbokhor\aiplayer.cpp(147) : see reference to class template instantiation 'std::priority_queue<_Ty,_Container,_Pr>' being compiled 
1>   with 
1>   [ 
1>    _Ty=AIPlayer::getSafeRouteTo::node, 
1>    _Container=std::vector<AIPlayer::getSafeRouteTo::node>, 
1>    _Pr=`anonymous-namespace'::<lambda0> 
1>   ] 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+1

Является ли это код, который вы пытаетесь напрямую компилировать? Пожалуйста, сделайте [SSCCE] (http://sscce.org/). – GManNickG

+0

@GManNickG теперь это точная функция, которую я пытаюсь скомпилировать. все работает отлично, за исключением лямбда-части. – Ali1S232

+0

@Gajet: удалены биты, которые не имеют отношения к проблеме или показывают контекст. –

ответ

4

лямбда не является конструктивным по умолчанию. Вы должны передать его в этот конструктор priority_queue:

explicit priority_queue(const Compare& x = Compare(), Container&& = Container()); 

Как это:

priority_queue<node,vector<node>, decltype(lambdaFunction)> Q (lambdaFunction); 
+0

Кажется, что он теперь скомпилирован, хотя мне пришлось помещать круглые скобки вместо '{}' – Ali1S232

+1

@Gajet: Right, VC++ не поддерживает равномерный синтаксис инициализации. – ildjarn

Смежные вопросы