>

이것은 모두 하나의 클래스에 있습니다. 클래스 B에는 목록이 있습니다.

class A{
   bool compare = [](const B& lhs, const B& rhs){
     return lhs.list.size() >= rhs.list.size();
   };
   priority_queue<B, vector<B>, decltype(compare)> pq(compare);
};

pq에 오류가 있습니다. 람다 함수에 익숙하지 않으므로이 함수를 해결하는 방법에 대한 단서가 없습니다.

오류 : 비교는 유형이 아닙니다


  • 답변 # 1

    회원 compare   bool 입니다 , 함수가 아닌 값 true . 람다 유형에서 bool(*)(const B&, const B&) 로의 암시 적 변환이 있습니다. 그런 다음 bool 로 변환  함수 포인터 유형에서. 캡처 목록에 무엇이든 추가하면 상태 저장 람다는 함수 포인터로 변환되지 않으므로 해당 행이 실패합니다.

    데이터 멤버 auto 를 선언 할 수 없습니다 따라서 람다가 되려면 클래스 범위에있을 수 없습니다. 하지만 꼭 그럴 필요는 없습니다. 정적 함수는 제대로 작동합니다.

    class A{
       static bool compare(const B& lhs, const B& rhs) {
         return lhs.list.size() >= rhs.list.size();
       }; 
       std::priority_queue<B, std::vector<B>, decltype(compare)> pq;
    public:
       A():pq(compare){}
    };
    
    

  • 답변 # 2

    몇 가지 사항을 변경해야했습니다. 먼저 람다 선언이 이상합니다. 람다는 마지막에 반환 값을 제공합니다 (허용 된 것으로 생각하지만 내 의견으로는 람다를 부울 변수에 할당하려고하는 것으로 읽힐 수 있습니다.

    둘째, 실제 유형의 람다를 캡처하는 자동 또는 유사한 키워드로 동일한 작업을 수행 할 수 없었습니다. 이는 정적 constexpr이 현재의 것과 상당히 거리가 멀다는 것을 의미하기 때문입니다.

    따라서, 나는 분명히 람다에 좋은 유형을주었습니다 (람다의 유형은 항상 이상합니다. 따라서 읽을 수있는 오류 메시지를 원한다면 람다를 std :: function<>에 할당하는 것이 좋습니다. 거의 문제가되지 않습니다. 서명을 모르는 경우 템플릿을 작성해야 할 가능성이 있지만 람다가있는 클래스도 템플릿으로 표시되며 문제가 없습니다.

    마지막으로, 모든 객체를 올바른 순서로 구성하는 것이 어려울 수 있으므로 요소를 사용하여 큐를 초기화하는 방법이 잘못되었습니다. 따라서 초기화가 A의 생성자로 이동되었습니다.

    내 수정 사항은 다음과 같습니다.

    #include<queue>
    #include<list>
    #include<vector>
    #include<functional>
    using namespace std;
    struct B{
      std::list<int> list;
    };
    class A{
       function<bool(const B&, const B&)> compare = [](const B& lhs, const B& rhs) ->bool{
         return lhs.list.size() >= rhs.list.size();
       }; 
       std::priority_queue<B, vector<B>, decltype(compare)> pq;
       A():pq(compare){}
    };
    
    int main()
    {
    }
    
    

    마지막으로, B의 멤버가 list라는 이름이 마음에 들지 않습니다. list는 유형이기도합니다.

관련 자료

  • 이전 자식 - webrtc : "참조는 나무가 아닙니다"하지만 ui에서 커밋을 볼 수 있습니다
  • 다음 java - android - 사용자 언어로 현재 요일 (월요일 등)을 얻는 방법은 무엇입니까?