C ++ priority_queue с ошибкой лямбда-компаратора - PullRequest
36 голосов
/ 27 апреля 2011

У меня есть следующий ошибочный код, который я пытаюсь скомпилировать в VC2010, но я получаю ошибку C2974 это происходит только тогда, когда я включаю лямбда-выражение, поэтому я предполагаю, что оно что-то имеетчто делать с этим.

typedef pair<pair<int, int>, int> adjlist_edge;
priority_queue< adjlist_edge , vector<adjlist_edge>,
    [](adjlist_edge a, adjlist_edge b) -> bool {
        if(a.second > b.second){ return true; } else { return false; }
    }> adjlist_pq;

Я знаю, что форма определения шаблона верна как

priority_queue<int , vector<int>, greater<int>> pq;

Работает, как и ожидалось.Есть идеи, что я делаю не так?Есть ли что-то явно не так с лямбда, которая выглядит неправильно, что я мог бы пропустить?Спасибо за чтение!

Ответы [ 2 ]

58 голосов
/ 27 апреля 2011

Сначала определите лямбда-объект, затем передайте его типу шаблона, используя decltype, а также передайте его непосредственно конструктору.

auto comp = []( adjist a, adjlist b ) { return a.second > b.second; };
priority_queue< adjlist_edge , vector<adjlist_edge>, decltype( comp ) >
     adjlist_pq( comp );
15 голосов
/ 27 апреля 2011

priority_queue принимает компаратор в качестве аргумента шаблона.Лямбда-функции являются объектами и поэтому не могут использоваться в качестве аргументов шаблона (только очень немногие типы могут быть, в том числе целочисленными).

Вы можете попробовать использовать decltype там:

priority_queue< adjlist_edge , vector<adjlist_edge>,
               decltype( [](adjlist_edge a, adjlist_edge b) -> bool {
                if(a.second > b.second){ return true; } else { return false; }
               })>
adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool {
                if(a.second > b.second){ return true; } else { return false; }
             } );

В противном случае ( и будет ), вы можете использовать function<>:

priority_queue< adjlist_edge , vector<adjlist_edge>,
                function<bool(adjlist_edge,adjlist_edge)> >
adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool {
                if(a.second > b.second){ return true; } else { return false; }
            } );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...