2013-05-25 35 views
1

我有這段代碼使用lodepng庫來加載PNG文件。圖書館是好的,成功地用於其他項目,沒有問題。C++代碼不能編譯 - 匹配參數列表

const std::string tmpString = mapFileName.GetConstString(); 
    std::vector<unsigned char> xx; 
    unsigned int error = lodepng::decode(xx, (unsigned int)this->mapWidth, (unsigned int)this->mapHeight, tmpString, LCT_GREY, (unsigned int)8);   

我想要編譯這一點,但越來越怪異的錯誤消息。

MapHelper.cpp(72): error C2665: 'lodepng::decode' : none of the 5 overloads could convert all the argument types 
      c:\ImageUtils\lodepng.h(200): could be 'unsigned int lodepng::decode(std::vector<_Ty> &,unsigned int &,unsigned int &,const unsigned char *,size_t,LodePNGColorType,unsigned int)' 
     with 
      [ 
       _Ty=uint8 
      ] 
      c:\ImageUtils\lodepng.h(203): or  'unsigned int lodepng::decode(std::vector<_Ty> &,unsigned int &,unsigned int &,const std::vector<_Ty> &,LodePNGColorType,unsigned int)' 
      with 
      [ 
       _Ty=uint8 
      ] 
      c:\ImageUtils\lodepng.h(211): or  'unsigned int lodepng::decode(std::vector<_Ty> &,unsigned int &,unsigned int &,const std::string &,LodePNGColorType,unsigned int)' 
      with   
[ 
      _Ty=uint8 
      ] 
      c:\ImageUtils\lodepng.h(759): or  'unsigned int lodepng::decode(std::vector<_Ty> &,unsigned int &,unsigned int &,lodepng::State &,const unsigned char *,size_t)' 
      with 
      [ 
       _Ty=uint8 
      ] 
      while trying to match the argument list '(std::vector<_Ty>, unsigned int, unsigned int, const std::string, LodePNGColorType, unsigned int)' 
      with 
      [ 
       _Ty=uint8 
      ] 

我看不出什麼問題,輸入參數類型與庫中相同,並且類型中可能不存在衝突。

編輯 功能,在那裏我有lodepng::decode不是const的

+0

完成了你確定所有的'無符號int'鑄件是必要的? – chris

+0

@chris他們沒用,但沒有他們,行爲是一樣的。我寫他們只是爲了匹配函數參數與lodepng –

+0

完全一致。我在不同的項目中使用相同的代碼,並且所有內容都編譯得很好。我知道,該編譯器不能匹配函數,但我不明白爲什麼。我使用的類型與列表中的第三個解碼函數相同。 –

回答

4

嗯,我本來期望一個更精確的錯誤消息,但考慮到與此簽名

'(std::vector<_Ty> &,unsigned int &,unsigned int &,const std::string &, LodePNGColorType, unsigned int)' 

過載的情況下相比於你自己的調用

'(std::vector<_Ty>, unsigned int, unsigned int, const std::string, LodePNGColorType, unsigned int)' 

那麼問題必須在於您需要unsigned int&而您提供unsigned int。雖然這通常很好,但它不是在這種情況下,因爲您在函數調用中投射到unsigned int,創建一個R值。所以,試試這個:

unsigned int wd = (unsigned int)this->mapWidth, 
      ht = (unsigned int)this->mapHeight; 
unsigned int error = lodepng::decode(xx, wd, ht, tmpString, LCT_GREY, (unsigned int)8); 

按引用傳遞一般是用來給輸出回調用代碼。如果wdht僅僅用作輸出,那麼其實你並不需要初始化它們和

unsigned int wd, ht; 

是不夠好。在函數返回後,無論哪種方式wdht將有新的價值觀,你可能會需要使用

this->mapWidth = wd; 
this->mapHeight = ht; 
+0

謝謝,解決..沒有意識到,我不能做轉換爲參考。 –