2011-04-04 123 views
3

新手C++和書籍學習,所以我可以是相當迂腐或在我的推理miopic。模板函數和常量/非常量參考參數

在模板函數的情況下,我已經讀過,當Reference傳遞參數時,只有從Reference /指針到NonConst到Reference /指向Const的轉換纔會完成。

這意味着我相信

template <typename T> int compare(T&, T&); 

當調用比較(CI1,CI1),與CI1是consntant INT,從常量到NonCost轉換是不允許的參考參數應該失敗。

但它在我的編譯器(Visual C++ 10)中有效。有人能解釋我發生了什麼問題嗎?


template <typename T> int compare(T&, T&); 

template <typename T> int compare(T &v1, T &v2) 
{ 
    // as before 
    cout << "compare(T, T)" << endl; 
    if (v1 < v2) return -1; 
    if (v2 < v1) return 1; 
    return 0; 
} 


const int ci1 = 10; 
const int ci2 = 20; 

int i1 = 10; 
int i2 = 20; 

compare(ci1, ci1);  
compare(i1, i1); 

回答

3

呼叫

compare(ci1, ci1); 

產生T作爲const int類型(在您的首選符號)。

有效函數簽名是那麼

int compare(int const&, int const&) 

您可以使用typeid(x).name()查出來你確實有哪些類型。

注意:使用g ++會產生一些不可用的簡寫形式,然後您需要使用特殊的g ++特定的運行庫lib函數進行解碼。

乾杯& hth。

+0

或者使用g ++ filt命令行工具解碼 – 2011-04-04 14:10:53

1

在比較的情況下(CI1,CI1); T將是const int。這就是爲什麼它的工作原理

2

T將任何類型的變量是 - 你的情況const int,所以compare最終實例看起來像

// T = const int 
int compare(const int& v1, const int& v2) 

在第一種情況下與compare(ci1,ci2)和像

// T = int 
int compare(int& v1, int& v2) 

compare(i1,i2)

1

這是可以接受的,因爲當您將int const替換爲T時,可以實例化該函數。

2

在第一種情況下,模板用T = const int實例化,這很好。

如果您嘗試compare(i1, ci1),您將收到一個錯誤,因爲它無法找到兼容int &const int &的模板參數。將簽名更改爲compare(const T &, const T &)將解決該問題。