채점하는데 stl sort 관련 컴파일 에러가 나는군요 도와주세요

  • Leie
    Leie

    /home/controller/submissions/22299/submission.cpp: In function 'void input()': /home/controller/submissions/22299/submission.cpp:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result /home/controller/submissions/22299/submission.cpp:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result /home/controller/submissions/22299/submission.cpp: In function 'int main()': /home/controller/submissions/22299/submission.cpp:89: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result /usr/include/c++/4.3/bits/stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = Doll, _Compare = bool (*)(Doll&, Doll&)]': /usr/include/c++/4.3/bits/stl_algo.h:1952: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = Doll*, _Size = int, _ (... omitted ..)
    에러 메시지가 다음과 같이 뜨고 있는데, 어떤 부분이 에러가 나는 것인지 잘 모르겠습니다. VS2008에선 컴파일 에러 없이 잘 돌아가고 있습니다.
    제 코드에서는 다음과 같이 사용하였습니다.
    struct Doll in[100001];
    static bool compare(struct Doll &a, struct Doll &b){
    return a.value < b.value;
    }
    static bool compare2(struct Doll &a, struct Doll &b){
    return a.index < b.index;
    }
    ...
    sort(in, in+N, compare);
    ....

    [이 글은 과거 홈페이지에서 이전된 글입니다. 원문보기]

    14년 전
3개의 댓글이 있습니다.
  • Leie
    Leie

    자문 자답하네요 -_-.... const struct Doll &a 이런식으로 하니까 되네요..
    이거 왜그런지 설명해주실분 있으신가요? ㅠㅠ


    14년 전 link
  • dgoon
    dgoon

    const A 와 A 는 조금 관계가 있는 '다른 타입' 이라고 생각해보면 어떨까요. sort 가 사용하는 비교 함수는 변경 불가능한 레퍼런스를 받아 사용하는데, 변경 가능한 레퍼런스를 받는 함수를 넘겼기 때문에 싫어하게 됩니다. 못바꾸는 애만 받아야 하는데, 바꿀 수 있는 애를 받아서 낭패! 라는 느낌일까요 ... 비교 함수가 보는 엘리먼트를 바꿀 수 있는 가능성을 애초부터 제거하는 것이 골치아픈 버그의 가능성을 막을 수 있기 때문에(그리고 상식에 어긋나지 않고) 저런 모양으로 되어 있습니다.
    아마 const T & a 말고 T a 로 해도 될 겁니다. (어느쪽이든 원본(?)의 변화가 없기 때문에)
    자세한건 const in C++ 같은 키워드로 검색해보시면 우왕굿.
    ... 그런데 VS2008 에선 저게 빌드가 되는군요. 몰랐네요.


    14년 전 link
  • Leie
    Leie

    답변 감사합니다. ^-^


    14년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.