2016-03-17 43 views
0

我正在構建用於64位的軟件,以前是爲32位構建的軟件。該軟件是完全地爲32位工作時,我建立了64位這是給像錯誤C2782:'const _Ty&std :: min(const _Ty&,const _Ty&)':template parameter'_Ty'is ambiguous

error C2782: 'const _Ty &std::min(const _Ty &,const _Ty &)' : template parameter '_Ty' is ambiguous 
see declaration of 'std::min' 
     could be 'size_t' 
     or  'unsigned int' 

一些錯誤行

unsigned int i = ...; 
unsigned int maxPeakWidthInPixel = ...; 
size_t steps = ...; 
unsigned int endj = min(i + maxPeakWidthInPixel + 1, steps); // error 

誤差大約是不能夠推斷類型的編譯器參數 - 但這是如何編譯32位而不是64位?

+0

我們可以看到代碼嗎?聲明變量i,maxPeakWidth和步驟 –

+0

這意味着你已經混合了'i',''maxPeakWidthInPixel'和'steps'類型。這些類型需要同意才能生成模板代碼 – EdChum

+0

「maxPeakWidthInPixel」和「steps」的類型是什麼? – NathanOliver

回答

0

兩個參數之一是size_t,另一個是unsigned int。在32位平臺上,兩者是相同的類型,所以沒有問題。

在64位平臺上,它們是不同的類型,並且min()模板要求兩個參數具有相同的類型,這就是您的問題。

無論哪個參數是unsigned int,明確地將其轉換爲size_t。這也許是第一個:

unsigned int endj = min((size_t)(i + maxPeakWidthInPixel + 1), steps); 

但是,如果不是的話,投對方一個size_t,來代替。

+0

當然,變量'endj'也應該是'size_t'類型(或者只是'auto')。 – mindriot

+2

我會說在你的32位平臺上,兩者是相同的類型,所以沒有問題。*。該標準保證沒有關於size_t,除了它是無符號的,並且它的大小足以包含任何對象的字節數 * – NathanOliver

+0

這是行得通的!謝謝,我保持endj爲unsigned int。 – Raj

1

明確指定模板類型以解決歧義。

min<size_t>(...); 

在你在size_t平臺未unsigned int。所以類型推導機制無法知道要做哪個模板實例化。

或者,您可以簡單地避免混合類型,並根據size_tunsigned int執行所有操作。無論哪種情況都適合您的特定應用。

+0

謝謝,那就是我所需要的。 – Raj

相關問題