2011-11-21 3 views
2

Cplusplus.com에서 map :: map 참조를 읽었으므로이 작업을 수행하는 방법을 아직 모르겠습니다. 누구든지 내게 조언을 해줄 수 있다면, 나는 매우 감사 할 것입니다. 그럼 난 그것으로 삽입 할std :: map에 사용자 정의 객체 삽입

std::map<TriSpec, unsigned int> TriSpecMap; 

:

내가하고 싶은 것은 다음과 같은지도를 만드는 것입니다

result = TriSpecMap.insert(std::make_pair(triSpecObject, anUnsignedInt)); 

내가 과부하를하고 있습니다 경우 사람이 나에게 설명 할 수 올바른 연산자, 그리고 만약 내가 사용하고있는 함수/형식이 맞다면? result.second를 볼 때 삽입되는 객체가 이미지도에 존재해야한다는 것을 알게되면 항상 사실입니다. 당신의 operator< 모든 경우에 값을 반환하지 않습니다 - 다음은 컴파일 것처럼 보이지 않는 내 TriSpec 헤더와 cpp를

//TriSpec.h 
#ifndef TRISPEC_H 
#define TRISPEC_H 
class TriSpec 
{ 
public: 
    TriSpec(void); 
    ~TriSpec(void); 

    unsigned int m_position; 
}; 
bool operator< (const TriSpec& lhs, const TriSpec& rhs); 
#endif 


//TriSpec.cpp 
#include "TriSpec.h" 

TriSpec::TriSpec(void){} 
TriSpec::~TriSpec(void){} 

bool operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
     if (lhs.m_position < rhs.m_position) return true; 
     else return false; 
} 

답변

2

:이 같은 기대 작품 그리고

bool friend operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
    return (lhs.m_position < rhs.m_position); 
} 

:

int main(int argc, _TCHAR* argv[]) 
{ 
    std::map<TriSpec, unsigned int> TriSpecMap; 

    TriSpec triSpecObject1; 
    triSpecObject1.m_position = 1; 

    TriSpec triSpecObject2; 
    triSpecObject2.m_position = 1; 

    TriSpec triSpecObject3; 
    triSpecObject3.m_position = 3; 

    std::pair<std::map<TriSpec, unsigned int>::iterator, bool> retVal = 
     TriSpecMap.insert(std::make_pair(triSpecObject1, 1)); 

    retVal = TriSpecMap.insert(std::make_pair(triSpecObject2, 1)); 

    retVal = TriSpecMap.insert(std::make_pair(triSpecObject3, 1)); 

    return 0; 
} 

첫 번째 삽입 결과는 true이고 두 번째 결과는 false이며 세 번째는 true이어야합니다. 맵 컨테이너에는 두 개의 객체, 즉 triSpecObject1 및 triSpecObject3이 포함됩니다.

0

에 대한 간단한 예입니다. (편집은 : 당신이, 감사를 수정했습니다.) 당신은 그것을 상당히 단순화 할 수 있습니다 : 당신은지도에 삽입 전체 코드를 보여주지 않기 때문에

bool operator< (const TriSpec& lhs, const TriSpec& rhs) 
{ 
     return (lhs.m_position < rhs.m_position); 
} 

, 그 이유는 반환 값을 말하는 것은 불가능하다 .second은 항상 true를 반환합니다.

나는 (심지어 친구 키워드없이 컴파일되지 않습니다) 친구의 방법이 될 것을 부울 연산자를 제외하고 코드에 문제가 표시되지 않습니다
+0

컴파일되지 않는 또 다른 이유는 'T C :((void)'함수 서명 (또는 멤버 함수에 대한 올바른 형식)입니다. – moshbear

+1

@moshbear : 왜 컴파일되지 않습니까? C에서 상속받은 "기능"중 하나가 아닌가요? –

+0

OP의 게시물에있는 코드는이 대답이 나온 이후 수정되었습니다. 당신은 당신의 대답을 수정할 수도 있습니다. –

관련 문제