2016-08-03 45 views
1
#include <iostream> 
const char* max(const char* a, const char* b) { 
    return strcmp(a,b) < 0 ? b : a; 
} 

template <typename T> 
const T& max(const T& a, const T& b, const T& c) 
{ 
    return max(max(a,b),c); 
} 

int main() 
{ 
    char* a = "abc"; 
    char* b = "cde"; 
    char* c = "def"; 
    const char* r = max(a,b); 
    char* s = max(a,b,c); 
    return 0; 
} 

不能編譯:模板函數中的引用類型轉換?

max3a.cpp:9:12: error: invalid conversion from 'const char*' to 'char*' [-fpermissive]

return max(max(a,b),c); 

如果我更改模板功能

template <typename T> 
const T& max(const T& a, const T& b, const T& c) 
{ 
    (const T)return max(max(a,b),c); 
} 

那麼它編譯成功。

如果Tchar *,的max(max(a,b),c)類型是const char*,這是const T。爲什麼?

+0

因爲你定義了它。你可以從第2行中刪除'const'。 – SpamBot

+0

你可能需要重載'char * max(char *,char *)'。 –

+3

'char * a =「abc」;'是無效的C++,它應該是'const char * a =「abc」;' – Jarod42

回答

2

如果Tchar *(字符指針),然後的max<T>()返回類型char const *(指向恆定炭)。

它是char *const&(參考常數指針到char)。

,因爲你不能隱式指針轉換爲固定炭指針可變字符你得到一個錯誤。

+0

關鍵是'const T'確實等於const char *' – Jichao

+0

@Jichao,不是。如果'T'是'char *'(一個**指向'char' **),那麼'const T'是一個**常量指針,指向'char' **('char * const'),而不是* *指向constart char的指針)**('char const *')。這可能有助於你的理解,在最後可以出現的位置(即寫'T const'而不是'const T')一致地寫'const'以避免這種常見的混淆。 –

+0

我想念不,thx – Jichao