2013-04-29 6 views
1

SDL_image로 사전을 만든 것처럼 SDL_ttf로 글꼴 사전을 만들려고합니다. 모두 사전 얹는하나의 함수에서 Make_Pair 식별자를 찾을 수 없지만 다른 함수에서 찾을 수 있습니다.

struct fontinfo 
    { 
     string assetname; 
     int size; 
    }; 

: 글꼴이 pnt_size에 저장되어 있기 때문에 나는이 정보를 포함하는 구조체를 만들어

map<string, SDL_Surface*> imageDictionary; 
map<fontinfo*, TTF_Font*> fontDictionary; 

둘 사이의 차이는 글꼴 사전뿐만 아니라를 포함 할 필요가 있다는 것입니다 문자열을 파일뿐만 아니라 글꼴의 크기에도 적용합니다.

그런 다음 이미지 또는 글꼴이 객체에 의해 요청을 받으면 객체에 대해 get 함수를 호출합니다. 이제 getSprite 잘 작동 :

TTF_Font* ResourceManager::getFont(string assetname, int size) 
    { 
     if (assetname == "" || size < 0) 
      return NULL; 

      fontinfo* info = new fontinfo(); 

      info->assetname = assetname; 
      info->size = size; 
      map<fontinfo*, TTF_Font*>::iterator it = fontDictionary.find(info); 
      if (it != fontDictionary.end()) 
       return it->second; 
      else 
      { 
       TTF_Font* font = Load_Font(assetname, size); 
       if (font != NULL) 
        fontDictionary.insert(make_pair(info, font)); 
       return font; 
      } 
    } 

컴파일러는 나에게 및 발견하지 ID를 알려줍니다

SDL_Surface* ResourceManager::getSprite(string assetname) 
    { 
     if (assetname == "") 
     return NULL; 

     map<string, SDL_Surface*>::iterator it = imageDictionary.find(assetname); 
     if (it != imageDictionary.end()) 
      return it->second; 
     else 
     { 
      SDL_Surface* image = Load_Image(assetname); 
      if (image != NULL) 
       imageDictionary.insert(make_pair(assetname, image)); 
      return image; 
     } 
    } 

getFont 방법은 그것이 fontinfo 대신 string (A)의 사용한다는 사실을 제외하고 거의 동일 make_pair이며, make_pair 기능의 경우에만 getFont입니다. make_pairgetSprite에 문제가 없습니다.

+0

안녕하세요,이 파일들은 같은 파일에 있습니까? 그것은 하나의 파일처럼 보일 뿐이며'#include '과 다른 파일은 포함되어 있습니다 (또는 포함하고있는 다른 것을 포함합니다). – David

+0

그들은 실제로 같은 파일에 있습니다. 둘 다 Class ResourceManager에서 가져온 것이고 그들은 서로 바로 위에 있습니다. – M4st3rM1nd

답변

4

첫 번째 예에서는 make_pair을 호출하고 컴파일러는 첫 번째 인수가 해당 네임 스페이스 (std::string)에 있기 때문에 namespace std에서 찾습니다. 두 번째 예제에서 컴파일러는 namespace std을 볼 이유가 없으므로 명시 적이어야하고 std::make_pair이라고해야합니다.

암시 정합 기능이나 코닉 ADL 조회로 알려져 측면 참고로 https://en.wikipedia.org/wiki/Argument-dependent_name_lookup

std::map::insert의 인수로 myMapType::value_type(foo, bar)보다는 std::make_pair(foo, bar)를 사용하는 것이 바람직하다. 이는 foo와 bar의 유형이 (const 한정자를 포함하여) 맵의 유형과 정확히 일치하지 않는 경우 일부 컴파일러는 임시 쌍의 복사를 최적화 할 수 없기 때문입니다. 이것은 미세한 최적화이므로, 더 읽기 쉽지만 알아두면 make_pair을 계속 사용하십시오.

+0

존 감사합니다, 매력처럼 일했습니다! – M4st3rM1nd

0

은 명시하고 make_pair

imageDictionary.insert(std::make_pair(assetname, image)); 

네임 스페이스 std에서 때문에 두 번째 기능 컴파일러에서 원하는 상태가 될이 네임 스페이스로부터 인수 (다음 '리 케이 컴파일러가 없기 때문에 std에서 찾을 수있는 수단이 없다 이 네임 스페이스에서 조회를 수행하여 구성원을 해결하십시오.)

fontDictionary.insert(std::make_pair(info, font));