2013-04-29 19 views
1

我想用SDL_ttf製作一個字體字典,就像我用SDL_image製作字典一樣。由於字體存儲與pnt_size我做了包含此信息的結構體:在一個函數中找不到Make_Pair標識符,但在另一個函數中找到

struct fontinfo 
    { 
     string assetname; 
     int size; 
    }; 

其次是兩個字典:

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

兩者之間的區別是,字體字典不僅需要包含字符串到文件,但也是字體的大小。

然後當圖像或字體被對象請求時,它會調用它的get函數。現在getSprite正常工作:

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

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; 
      } 
    } 

編譯器告訴我找不到和標識make_pair未定義,但僅適用於getFontmake_pair函數。 getSprite中的make_pair沒有問題。

+0

嗨,這些函數在同一個文件中嗎?它看起來像1文件不是'#include '而另一個文件(或者包含其他東西包含它) – David 2013-04-29 00:16:58

+0

它們確實在同一個文件中。兩者都來自Class ResourceManager,它們正好在彼此之上。 – M4st3rM1nd 2013-04-29 00:17:57

回答

4

在第一個示例中,您調用make_pair,編譯器在namespace std中找到它,因爲它的第一個參數在該名稱空間(std::string)中。在第二個例子中,編譯器沒有這樣的理由去查看namespace std,所以你必須明確,並且說std::make_pair

隱含匹配功能被稱爲ADL或Koenig查找:https://en.wikipedia.org/wiki/Argument-dependent_name_lookup

作爲附帶說明,它是優選使用myMapType::value_type(foo, bar)而非std::make_pair(foo, bar)作爲參數std::map::insert。這是因爲如果foo和bar的類型與映射的類型(包括const限定符)不完全匹配,某些編譯器將無法優化臨時對的複製。這是一個可以肯定的微型優化,所以如果您發現它更具可讀性,請隨時繼續使用make_pair,但請注意。

+0

謝謝約翰,像魅力一樣工作! – M4st3rM1nd 2013-04-29 00:28:30

0

只是明確,要make_pairstd命名空間

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

,因爲在你的第二個函數編譯狀態沒有辦法找到它std因爲沒有從這個命名空間參數(然後編譯器沒有按」 t在這個命名空間中查找來解析一個成員)

fontDictionary.insert(std::make_pair(info, font)); 
相關問題