C++ - 関数テンプレートの具体化。1 時間デバッグしました。あらゆる手段を試しましたが、標準的な答えは正しいですが、コンパイルできません。
高洛峰
高洛峰 2017-05-16 13:27:45
0
3
653

私がやっていることは、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[]>(const char* x[], int n)

コード:

リーリー
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(3)
洪涛

声明: 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 は参照型を推定できないため、ここでは参照バージョンの特殊化は呼び出されません。もちろん、テンプレート パラメーターを指定して、この特殊化を呼び出すこともできます。

いいねを押す +0
洪涛

私の理解によれば、maxn 関数は長さ n の配列内の「最大の」要素を返す必要があるため、関数宣言は次のように記述する必要があると思います。 リーリー

このステートメントに従って実装を変更すると、コンパイルされます。

次のコードは、元のコードに基づいて単純に変更され、参照用に vs2017 でコンパイルされています。 リーリー
いいねを押す +0
漂亮男人

あなたは間違った特別バージョンを書きました。

リーリー

正しい姿勢:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート