テンプレート関数 "compare"が以下のように定義されています。テンプレートのインスタンシエーションエラー
#include<iostream>
using namespace std;
template<typename T>
void compare(const T&a, const T& b)
{
cout<<"Inside compare"<<endl;
}
main()
{
compare("aa","bb");
compare("aa","bbbb");
}
同じ長さの文字列リテラルとの比較をインスタンス化すると、コンパイラは不平を言いません。異なる長さのリテラルでは、 "エラー:(const char [3]、const char [5])を比較する呼び出しに一致する関数がありません"というメッセージが表示されます。
私は、 文字配列ではなく、文字ポインタです。 文字列リテラルは常にポインタに崩壊してはいけませんか?
void compare(const T* a, const T* b)
理由は、異なるサイズの文字配列の種類は実際には異なるタイプであるということです。
@Greg、現在の宣言の問題点は何ですか? – chappar
書面による宣言では、関数のcompareにはまったく同じ型の2つのパラメータが必要です。 "const char [3]"と "const char [5]"は同じ型ではありません。 –
既存のコードでは、 "compare"はvoid compare(char a [2]、char b [4])のように評価されます。参照の代わりにポインタを使うということは、2種類の大きさの配列(異なる型)ではなく、Tが安全に "char"と評価できることを意味します。 – Justicle