2012-03-19 3 views
6

Windows에서 Linux로 내 펑터를 이식하는 데 문제가 있습니다.오류 : xxx의이 인수로 const xxx를 전달하면 한정자가 제외됩니다.

struct stringCompare{ 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(strcasecmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 
: 나는 그것을 변경,

리눅스 나던 지원 _stricmp으로
struct stringCompare{ // Utilized as a functor for stl::map parameter for strings 
    bool operator() (string lhs, string rhs){ // Returns true if lhs < rhs 
     if(_stricmp(lhs.c_str(), rhs.c_str()) < 0) return true; 
     else return false; 
    } 
}; 

대신 strcasecmp를 사용 : 원래는 다음과 같다 을 (펑터 엄격한 약한 순서에 대한 STL ::지도에 전달할)

그리고 지금은 "CONST"매개 변수에 대한 불평 :

passing const stringCompare as this argument of bool stringCompare::operator() 
(std::string, std::string)â discards qualifiers 

나는 stringCompare이 일정한 ...

해야 전제로 이유를 완전히 확실하지 않다

는 그리고 인스턴스화되고 이것에 대해 화가 라인은 다음과 같습니다

if(masterList->artistMap.count(songArtist) == 0) 

artistMap 문자열 키를 가진 STL ::지도 것.

어디서 잘못 될지 잘 모르겠습니다. bool operator() 매개 변수를 const로 변경하려고 시도했습니다. 일종의 비정규 매개 변수 전달에 대해 불만을 나타 냈기 때문에 나타납니다. 이것은 작동하지 않았으며 'bool operator()'를 'const bool operator()'로 변경하지 않았습니다.

내가 아는 한 strcasecmp는 const 함수이기 때문에 const가 아닌 상수 또는 상수 매개 변수 (c_str()도 const 임)를 전달해야하므로 틀린 위치를 정확하게 알 수 없습니다. .

나는 봤어 비슷한 문제가 있지만 난 아직도 꽤 stackoverflow 및 몇 가지 다른 장소에서 본 적이 문제에서 감각을 만들 수 없습니다.

내가 이것을 사용하고 데이터 유형은 다음과 같습니다

map<string, set<song, setSongCompare>*,stringCompare > artistMap; 
+0

아마도'const' 규정에 관한 ?? 경고가'map' 선언이나 다른 곳에서보고됩니까? – Kashyap

+0

당신은 이식 가능하고 const char *가 아닌 std :: string에서 작동하는 문자열 알고리즘을 사용하는 것이 훨씬 낫습니다. 대소 문자를 구분하지 않는 비교 방법이 있습니다. – 111111

+0

이 줄에보고되었습니다 : if (masterList-> artistMap.count (songArtist) == 0) songArtist는 문자열입니다. – Glem

답변

10

두 가지 :

  1. 당신의 bool operator()const로 정의. 그것은 단지 좋은 습관입니다. 이 함수는 클래스의 멤버 변수에 부작용이 없다는 것을 컴파일러에 알려줍니다.

  2. lhsrhs 인수에 const & 한정자를 추가하십시오. 장소 전체에 메모리를 복사하는 대신 지속적인 참조를 전달하는 것도 우수 실행입니다. 참조를 const으로 선언하면이 함수는 참조 된 객체에 부작용이 있어서는 안된다는 것을 컴파일러에 알리는 것입니다.

귀하는 다음과 같이 operator()가 보일 것입니다 :

bool operator() (const string &lhs, const string &rhs) const 
{ 
    return strcasecmp(lhs.c_str(), rhs.c_str()) < 0; 
} 
+0

내가 언급 한 것처럼 이것을 시도해 보면 같은 결과가 나온다. – Glem

+1

@Glem'const bool operator() (...)'하지만'bool operator() (...) const' – Praetorian

+0

나는 이런 식으로 시도했다고 생각했지만, 그렇지 않다고 나는 생각한다! 이것은 효과가있었습니다. const 매개 변수 뒤에 매개 변수가 필요한 이유는 무엇입니까? 나는 전에 이것을 보지 못했다. 또한 내부 함수 중 어느 것도 비 상수가 아닌 경우 const에 대해 걱정하지 않아야합니까? 그냥 왜 내 머리에서 오류가 발생했는지 분명히 할 수 있습니다. 고맙습니다! – Glem