デフォルトのテンプレートパラメータを持つポリモーフィッククラスのテンプレート推定は失敗します

アテナ

この例を考えてみましょう。

#include <memory>

template<typename T>
class A {};

template<typename T1, typename T2>
class B: public A<T1> {};

template<typename T = int>
void foo(std::shared_ptr< A<T> > test)
{

}

int main()
{
    auto p = std::make_shared<B<int, int>>();
    foo<int>(p);    // Works
    foo<>(p);       // Does not work
    foo(p);         // Does not work
}

fooのタイプTを明示的に指定せずにこれをコンパイルしようとしていますが、機能しません。明示的にT型を指定した場合、問題なく動作する理由はわかりませんが、T型を指定しない場合は、コンパイラにT型を指定したとしても、コンパイルされません。明示的に指定してください。

コンパイラが型Tを推測できない理由はわかりますが、指定しないとデフォルトの型Tを使用できないのはなぜですか?これを回避するにはどうすればよいですか。また、これを行う「適切な」方法は何ですか。

lubgr

この問題は、デフォルトのテンプレートパラメータとは関係ありません。代わりに、pstd::shared_ptr<B<int, int>>のタイプをstd::shared_ptr<T>テンプレート引数と照合することはできませんfoo。テンプレートの引数の推定中、変換は考慮されず、派生クラスインスタンスへの参照を基本クラス参照として渡すことは実際に変換です。

std::shared_ptr管理するポインタを明示的にアップキャストすることで、問題を修正できます

std::shared_ptr<A<int>> p = std::make_shared<B<int, int>>();

これで、これらの呼び出しは期待どおりに機能します。

foo<>(p); // Ok, argument matches the signature
foo(p);   // Same...

テンプレートの引数の型が関数テンプレートのパラメータリストに表示されるかどうか(推論が可能になるかどうか)に大きな違いがあることに注意してください。これらの2つのテンプレートを検討してください。

template <class T = int> void foo(T&&)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
}

template <class T = int> void bar(double)
{
    std::cout << __PRETTY_FUNCTION__ << "\n";
}

どちらもデフォルトのタイプですが、intこのようにインスタンス化されると

foo<>(0.0); // outputs: void foo(T&&) [with T = double]
bar<>(0.0); // outputs: void bar(double) [with T = int]

最初のインスタンス化は関数の引数を使用してテンプレートパラメーターを推定します(結果はdouble)。2番目のインスタンス化は何も推定せず、デフォルトでint。になります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

1つのパラメータとデフォルト値を持つクラステンプレート

分類Dev

デフォルトのパラメータを持つC ++テンプレートクラス、そしておそらくメタプログラミング

分類Dev

1 つのパラメーターを持つ C++ デフォルトのテンプレート コンストラクター

分類Dev

クラステンプレート引数の推定とデフォルトのテンプレートパラメータ

分類Dev

デフォルト値を持つデフォルトのテンプレートパラメータ?

分類Dev

デフォルトの他のテンプレートパラメータを使用して最初のテンプレート引数を推定する

分類Dev

コードの重複を避ける : typedef/デフォルトパラメータを持つテンプレートクラスを使用する (C++14)

分類Dev

ポリモーフィックサブクラスのテンプレートパラメータのタイプを確認する方法

分類Dev

角度グリッドには、インライン剣道グリッドのエディターテンプレート(リアクティブフォーム)を含む列があります。テンプレートコントロール(テキストボックス)とフォームはリンクしません

分類Dev

パラメータパック後の引数でテンプレートの推定が失敗する

分類Dev

テンプレート引数の控除とデフォルトのテンプレートパラメータを持つテンプレート変数

分類Dev

デフォルトのパラメーターを持つ関数をテンプレート化されたコンストラクターに渡して、ラムダを使用してstd :: function <void()>として保存しないのはなぜですか?

分類Dev

共通のcreateValueメソッドを定義するパラメーターを持つケースクラスのシェイプレスのジェネリックデフォルトインスタンスを使用してビルドします

分類Dev

デフォルトクラスのテンプレートパラメータリスト

分類Dev

デフォルトパラメータからテンプレートパラメータを推定する

分類Dev

「クラステンプレートのテンプレート引数の推定」は、可変個引数クラステンプレートの空のパラメータパックを推定することになっていますか?

分類Dev

小さいアリティのテンプレートテンプレートクラス引数としてデフォルトの引数を持つクラステンプレートの一貫性のない処理

分類Dev

推定されるコンテキストのプロパティを保持しながら、エイリアステンプレートをテンプレートテンプレートパラメータに推定する方法はありますか?

分類Dev

フォールド式内のテンプレートパラメータをデクリメントします

分類Dev

入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

分類Dev

c ++クラステンプレートはインスタンス化できますが、同じテンプレートパラメータを使用した関数テンプレートのインスタンス化は失敗します

分類Dev

すべてのクラスプロパティを持つコンストラクタ、またはセッターを持つデフォルトコンストラクタ?

分類Dev

デフォルトのテンプレートパラメータとして、他のパラメータに応じてネストされたテンプレートクラスのインスタンス化を設定する方法

分類Dev

デフォルトパラメータを持つC ++テンプレートパラメータ

分類Dev

オートコンプリートテキストボックスを作成する方法は、どのプロシージャが3つのパラメータ、つまりテキストボックス/パラメータフィールド、クエリの選択、接続を持っているかです。

分類Dev

デフォルトのテンプレートテンプレートパラメータ値はコンテキストから推測されますか?

分類Dev

C ++でデフォルトのテンプレートパラメータを使用してテンプレートクラスを使用する場合の「テンプレート引数が少なすぎるエラー」

分類Dev

ステップEXECスポーンで失敗しました:そのようなファイルまたはディレクトリはありません

分類Dev

AWSクラウドフォーメーションエラー:テンプレート検証エラー:テンプレートエラー:リソースNotificationsTopicはFn :: GetAttの属性タイプArnをサポートしていません

Related 関連記事

  1. 1

    1つのパラメータとデフォルト値を持つクラステンプレート

  2. 2

    デフォルトのパラメータを持つC ++テンプレートクラス、そしておそらくメタプログラミング

  3. 3

    1 つのパラメーターを持つ C++ デフォルトのテンプレート コンストラクター

  4. 4

    クラステンプレート引数の推定とデフォルトのテンプレートパラメータ

  5. 5

    デフォルト値を持つデフォルトのテンプレートパラメータ?

  6. 6

    デフォルトの他のテンプレートパラメータを使用して最初のテンプレート引数を推定する

  7. 7

    コードの重複を避ける : typedef/デフォルトパラメータを持つテンプレートクラスを使用する (C++14)

  8. 8

    ポリモーフィックサブクラスのテンプレートパラメータのタイプを確認する方法

  9. 9

    角度グリッドには、インライン剣道グリッドのエディターテンプレート(リアクティブフォーム)を含む列があります。テンプレートコントロール(テキストボックス)とフォームはリンクしません

  10. 10

    パラメータパック後の引数でテンプレートの推定が失敗する

  11. 11

    テンプレート引数の控除とデフォルトのテンプレートパラメータを持つテンプレート変数

  12. 12

    デフォルトのパラメーターを持つ関数をテンプレート化されたコンストラクターに渡して、ラムダを使用してstd :: function <void()>として保存しないのはなぜですか?

  13. 13

    共通のcreateValueメソッドを定義するパラメーターを持つケースクラスのシェイプレスのジェネリックデフォルトインスタンスを使用してビルドします

  14. 14

    デフォルトクラスのテンプレートパラメータリスト

  15. 15

    デフォルトパラメータからテンプレートパラメータを推定する

  16. 16

    「クラステンプレートのテンプレート引数の推定」は、可変個引数クラステンプレートの空のパラメータパックを推定することになっていますか?

  17. 17

    小さいアリティのテンプレートテンプレートクラス引数としてデフォルトの引数を持つクラステンプレートの一貫性のない処理

  18. 18

    推定されるコンテキストのプロパティを保持しながら、エイリアステンプレートをテンプレートテンプレートパラメータに推定する方法はありますか?

  19. 19

    フォールド式内のテンプレートパラメータをデクリメントします

  20. 20

    入力として異なるテンプレートパラメータを持つテンプレートクラスのフレンド関数

  21. 21

    c ++クラステンプレートはインスタンス化できますが、同じテンプレートパラメータを使用した関数テンプレートのインスタンス化は失敗します

  22. 22

    すべてのクラスプロパティを持つコンストラクタ、またはセッターを持つデフォルトコンストラクタ?

  23. 23

    デフォルトのテンプレートパラメータとして、他のパラメータに応じてネストされたテンプレートクラスのインスタンス化を設定する方法

  24. 24

    デフォルトパラメータを持つC ++テンプレートパラメータ

  25. 25

    オートコンプリートテキストボックスを作成する方法は、どのプロシージャが3つのパラメータ、つまりテキストボックス/パラメータフィールド、クエリの選択、接続を持っているかです。

  26. 26

    デフォルトのテンプレートテンプレートパラメータ値はコンテキストから推測されますか?

  27. 27

    C ++でデフォルトのテンプレートパラメータを使用してテンプレートクラスを使用する場合の「テンプレート引数が少なすぎるエラー」

  28. 28

    ステップEXECスポーンで失敗しました:そのようなファイルまたはディレクトリはありません

  29. 29

    AWSクラウドフォーメーションエラー:テンプレート検証エラー:テンプレートエラー:リソースNotificationsTopicはFn :: GetAttの属性タイプArnをサポートしていません

ホットタグ

アーカイブ