私がやっていることは、C++ Primer Plus の第 8 章の質問 6 です
2 つの関数テンプレートを作成する必要があります。1 つは int double 配列用で、もう 1 つは char*[] を使用するテンプレートです。
int と double は問題ありません。特定のものを長い間コンパイルできない理由がわかりません
その後、通常の関数を使用して再度作成したところ、長時間作業した後でも正常に実行できることがわかりました。動作しないので、オンラインで答えを探したところ、同じ答えを書いていることがわかりました
形式は基本的に同じです
エラー メッセージ: main.cpp:43:23: エラー: 'const char maxn(const char, int)' のテンプレート識別子 'maxn<const char []>' はどのテンプレート宣言テンプレートとも一致しません< ; >const char maxn
コード:
リーリー
声明:
template<> const char **maxn(const char **x, int n);
電話:
cout << "sx[5] max_address: " << (int*)*maxn(sx, 5) << endl;
定義:
リーリーあなたは 3 つの間違いを犯しました:
専門化構文が正しくありません
専門化中に 2 つの T タイプが矛盾します
多くのポインターは逆参照されません
アイデア:
テンプレート宣言:
template<typename T> T maxn(T x, int n);
调用:
maxn(sx, 5)
。其中变量sx的类型是const char *[5]
、つまり配列型。sx は配列型なので、テンプレートの仮パラメータの形式は
T
,这里sx会被隐式转换成指针类型(array to pointer conversion)const char **
,即T是const char **
です。したがって、専門分野は次のようになります
template<> const char **maxn(const char **x, int n);
追記: 直感的には、リファレンス バージョンには特化したものがあるはずです。ただし、T は参照型を推定できないため、ここでは参照バージョンの特殊化は呼び出されません。もちろん、テンプレート パラメーターを指定して、この特殊化を呼び出すこともできます。
私の理解によれば、maxn 関数は長さ n の配列内の「最大の」要素を返す必要があるため、関数宣言は次のように記述する必要があると思います。 リーリー
このステートメントに従って実装を変更すると、コンパイルされます。
次のコードは、元のコードに基づいて単純に変更され、参照用に vs2017 でコンパイルされています。 リーリーあなたは間違った特別バージョンを書きました。
リーリー正しい姿勢:
リーリー