ホームページ  >  に質問  >  本文

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

私がやっていることは、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)

コード:

リーリー
高洛峰高洛峰2686日前589

全員に返信(3)返信します

  • PHP中文网

    PHP中文网2017-05-16 13:29:45

    声明: 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
  • PHP中文网

    PHP中文网2017-05-16 13:29:45

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

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

    次のコードは、元のコードに基づいて単純に変更され、参照用に vs2017 でコンパイルされています。 リーリー

    返事
    0
  • 漂亮男人

    漂亮男人2017-05-16 13:29:45

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

    リーリー

    正しい姿勢:

    リーリー

    返事
    0
  • キャンセル返事