Как использовать лямбду в качестве метода сравнения STL в шаблонном классе? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь реализовать priority_queue, который содержит A<T> объекты и использует пользовательский Compare метод / тип.Согласно справочному примеру , это мой код:

template <class T>
class A{
    T value;
    A(T _value):value(_value){}
};

template <class T>
class ProblematicClass{

    auto cmp = [](A<T>* l, A<T>* r) {return l->value > r->value; };

    std::priority_queue < A<T>*, std::vector<A<T>*>, decltype(cmp) > q(cmp);
};

Но я получаю следующую ошибку:

ошибка C2853: 'cmp': элемент нестатических данных не может иметь тип, который содержит 'auto'

Я попытался определить определение lamda static, но это приводит к новой синтаксической ошибке:

ошибка C2143: синтаксическая ошибка: отсутствует '}' до 'возврата'

Не могли бы вы помочь мне с этим?

ОБНОВЛЕНИЕ : I 'м с использованием VS2013

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Для меня static отлично работает

static auto cmp = [](A<T>* l, A<T>* r) {return l->value > r->value; };

Для не статичных ... как насчет прохождения через using?

using lType = decltype([](A<T>* l, A<T>* r) {return l->value > r->value; });

lType cmp = lType{};
0 голосов
/ 06 февраля 2019

Нет необходимости делать cmp статичным.Вместо этого вы можете сделать это:

template <class T>
class A{
    T value;
    A(T _value):value(_value){}
};

template <class T>
class ProblematicClass{

    std::function<bool(A<T>*, A<T>*)> cmp = [](A<T>* l, A<T>* r) {return l->value > r->value; };

    std::priority_queue < A<T>*, std::vector<T>, decltype(cmp) > q;
};

Не забудьте включить <functional>, чтобы это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...