2016-08-03 17 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 Tある、const char*あります。どうして?

+0

と定義しています。 2行目から 'const'を削除することができます。 – SpamBot

+0

おそらく、' char * max(char *、char *) 'のオーバーロードが必要です。 –

+3

'char * a =" abc ";'は無効ですC++、 'const char * a =" abc ";' – Jarod42

答えて

2

Tchar *(charへのポインタ)である場合、max<T>()の戻り型がないchar const *(定数チャーへのポインタ)あります。

定数ポインタのcharへの参照)です。

あなたが暗黙的に変更可能な文字からポインタに定数文字ポインタを変換することはできませんので、あなたは、エラーが発生します。

+0

キーは 'const T''は' const char * 'と同じです – Jichao

+0

@Jichao、そうではありません。もし 'T'が' char * '(' char' **への**ポインタ)なら、 'const T'は' char' **( 'char * const')への定数ポインタです。 *ポインタを 'char'をconstartする)**(' char const * ')。これは、この共通の混乱を避けるために、現れることができる最新の位置に 'const 'を一貫して書くことを理解するのに役立ちます(つまり' const T'ではなく 'T const'を書きます)。 –

+0

私は見逃しています、thx – Jichao

関連する問題