ホーム>source

次のコードうまくコンパイルする。

<前>ウィズウィズ

しかし、行Xの場合、 #include <iostream> struct rgb8{ uint8_t r() const {return 0;}; }; template<typename L, typename P> L pixelToLevel(P p) { return static_cast<L>(p); } template<> uint8_t pixelToLevel<uint8_t, rgb8>(rgb8 p) { // <---------- line X return pixelToLevel<uint8_t, uint8_t>(p.r()); } int main() { pixelToLevel<uint8_t>(rgb8()); return 0; } を変更しますウィズウィズへ 、コンパイルに失敗します。

(生成される正確なコンパイラエラーは、明示的なテンプレート引数 rgb8 p かどうかによって異なりますまた、 const rgb8& p に変更されます 。)

rgb8 を渡したい場合、どうすればコンパイルできますか行Xの値ではなく参照によって?

const rgb8&
あなたの答え
  • 解決した方法 # 1

    特殊化の宣言でテンプレートパラメータを変更する必要があり、それを呼び出す場合もテンプレート引数を変更する必要があります。それ以外の場合は、代わりにプライマリテンプレートが呼び出されます。例えば

    <前>ウィズウィズ

    その後

    <前>ウィズウィズ

    住む

    編集

    与えられた template<> uint8_t pixelToLevel<uint8_t, const rgb8&>(const rgb8& p) { // <---------- line X return pixelToLevel<uint8_t, uint8_t>(p.r()); } 、プライマリテンプレートは完全一致です(with pixelToLevel<uint8_t, const rgb8&>(rgb8());   pixelToLevel<uint8_t>(rgb8()); として推定 )、特殊化には P への変換が必要です の場合、プライマリテンプレートが選択されます。

    テンプレートの特殊化の代わりにオーバーロードを適用できます。例えば

    <前>ウィズウィズ

    次に rgb8  2番目のオーバーロードを選択します。

    住む

  • 解決した方法 # 2

    @songyuanyaoの代替ソリューションは、

    <前>ウィズウィズ const

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ angularjs - throw new ERR_INVALID_ARG_TYPE( 'chunk'、['string'、 'Buffer']、chunk);TypeError [ERR_INVALID_ARG_TYPE]:「チャンク」引数は文字列またはバッファ型でなければなりません