2016-08-03 46 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