2013-04-12 2 views
0

사용 :린트 경고</p> <pre class="lang-cpp prettyprint-override"><code>struct IsInterestingMsg : public std::unary_function<string,bool> </code></pre> <p>린트 다음 정보/경고 토출 다음 표준 : unary_function으로부터 유도 된 펑 확인할 때 표준 : unary_function

1790: Base class 'std::unary_function<std::basic_string<char>,bool>' has no non-destructor virtual functions 

Warning 1509: base class destructor for class 'unary_function' is not virtual 

에 따르면, Scott Meyers에 따르면, functor 클래스 기본적으로 unary/binary_function에서 파생하여 적응할 수 있어야합니다. 따라서 임의의 생성자/소멸자가있는 클래스가 없습니다. 따라서 보푸라기 경고가 정당합니다.

누구나이 경고를 표시하지 않는 방법을 알고 있습니까? 은 전적으로이고 unary_function 등의 모든 용도로만 사용할 수 있습니까? 나는 그것이 사용될 때마다 -e1509을 쓰고 싶지 않다.

정보 # 1790은 공개 대신 개인 상속을 사용하여 표시 할 수 있지만 경고 # 1509는 그대로 유지됩니다.

+2

'std :: unary_function'은 C++ 11에서 더 이상 사용되지 않습니다. – juanchopanza

+0

@juanchopanza 프로젝트는 이전 C++을 사용해야합니다. 그래서 C++ 11은 불행히도 사용할 수 없습니다. 하지만 힌트를 주셔서 감사합니다. 나는 몰랐습니다. – minastaros

답변

1

다음 억제 나를 위해 작동 : 린트가에서 쉼표를 해석하지 않도록,

  • 참고 따옴표 인수가 esym 할 :

    /*lint -esym(1790, "std::unary_function<*,*>") -esym(1509, unary_function) */ 
    

    여기에 몇 가지 함정이있다 템플릿 매개 변수 목록

  • 메시지 1790은 "기호"에 매개 변수가 지정되어 있으므로 참조 할 때 전체 네임 스페이스를 사용해야합니다.
  • 메시지 1509 "Name"에 매개 변수화되어 있습니다.

네임 스페이스를 사용하는시기와 생략 할시기는 Lint의 오류 메시지에서 인용 된 문자열을 사용하십시오 , 괜찮을거야. 단점은 std :: unary_function에는 1509를 사용하지 않는 방법이 있지만 ns :: unary_function에는 사용하지 않는 것입니다.

+0

고마워요, 그게 정확히 제가 찾던 해결책입니다! 젠장, 네임 스페이스 였어! 억압을 만들 때 "이름"과 "기호"를 구별하는 방법에 대한 힌트는 매우 중요합니다. 물론, 그것은 나를 위해, 지금은 다른 클래스에 영향을주지 않고 전역으로 unary_function에 대한 이러한 경고를 억제 할 수 있습니다. – minastaros

1

슬픈, lint는 그것을 배웠어야합니다 ... 어쨌든, unary_function에서 파생 된 결과는 몇 가지 중첩 된 typedef입니다 (http://www.cplusplus.com/reference/functional/unary_function/ 참조). 상속하지 않고 직접 만들 수 있습니다.

또 다른 방법은 lint가 실행 중일 때 unary_function에 가상 소멸자를 조건부로 선언하는 것입니다. 필자는 개인적으로 비록 lint를 위해서라도 완벽하게 유효한 코드를 손상시키지 않을 것이며, 어떤 방식 으로든 다른 방식으로도 타협하지 않을 것입니다.

+0

이 경우에는 코드를 뒤집어 쓰지 않을 것입니다. * 린트를 만족시키기 위해서입니다. 내가 찾고 있던 것은 'unary_function'이있는 상태에서 # 1509 나 # 1790을 발생시키지 말고'-esym'도'-estring'도 안된다고 말하는 것입니다. 그래서 최소한의 영향은 클래스 선언 앞에'-e1790'을 추가하는 것입니다 - 그리고 모든 비슷한 경우에 이것을하기 위해 총알을 물립니다.드문 경우지만 전역 오류 코드 억제보다이 방법을 선호합니다. – minastaros