テンプレート化されたテンプレートパラメータU <T>はconst修飾子を認識しません

StefanKssmr

私は次のコードを調べていました(実際のアプリケーションはなく、好奇心からです)。

#include <memory>

template <typename T>
struct MyClass{};

template <template <class> class U, class T>
void foo(std::shared_ptr<U<T>> t){ }

template <class U>
void bar(std::shared_ptr<U> t){ }

int main()
{        
    std::shared_ptr<const MyClass<int>> ptr_to_const;
    std::shared_ptr<MyClass<int>> ptr;

    foo(ptr_to_const); // error
    foo(ptr); // OK

    bar(ptr_to_const); // OK
    bar(ptr); // OK
}

ただし、コンパイラはで失敗します

<source>: In function 'int main()':
<source>:17:9: error: could not convert 'ptr_to_const' from 'shared_ptr<MyClass<[...]>>' to 'shared_ptr<MyClass<[...]>>'
   17 |     foo(ptr_to_const); // error
      |         ^~~~~~~~~~~~
      |         |
      |         shared_ptr<MyClass<[...]>>

ここにデモを掲載しましのようにテンプレートテンプレートパラメータを使用する場合、const修飾子は無視されるようですfooなぜこれがコンパイルされないのか誰かが私に説明できますか?予想通り、呼び出しbarは問題を引き起こしません。

カレス

テンプレート推論の失敗です。

のない組み合わせもありませんUし、T一致するstd::shared_ptr<U<T>>からでstd::shared_ptr<const MyClass<int>>const MyClassテンプレートではありません。

あなたは過負荷にすることができます foo

template <template <class> class U, class T>
void foo(std::shared_ptr<const U<T>> t){ }

template <template <class> class U, class T>
void foo(std::shared_ptr<volatile U<T>> t){ }

template <template <class> class U, class T>
void foo(std::shared_ptr<const volatile U<T>> t){ }

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートパラメータAAがテンプレート化されたクラスA <T>自体である場合、このテンプレート化されたクラスのテンプレートパラメータ(T)を取得することは可能ですか?

分類Dev

<sizeof(T)>はc ++の継承されたクラステンプレートパラメータとして

分類Dev

std :: if_enabled_tパラメーターを使用したテンプレート関数の完全な特殊化

分類Dev

Clangは、部分的に特殊化されたテンプレートを解析しません。テンプレート<クラスT、クラスU = TYPE_A <T >>クラスTYPE_B;

分類Dev

パラメータ(const T&、const T&)または(const char(&)[N]、const char(&)[M])を使用したオーバーロードされたテンプレートのあいまいな呼び出し

分類Dev

テンプレートパラメータとしてのT []の使用

分類Dev

`T`がテンプレートタイプパラメータである場合、ʻusing Base :: operator T`は許可されますか?

分類Dev

C ++-14 enable_if_tを使用して、整数型でテンプレート化されたクラスのメンバー関数を選択します

分類Dev

T4テンプレート内の単体テストにパラメーターを渡す

分類Dev

テンプレート化されたスマートポインター型をテンプレートパラメーターとして渡す

分類Dev

テンプレートの特殊化:Tとは異なるパラメーターを持つメンバー関数

分類Dev

C ++の演算子T *(Tはテンプレートパラメーター)とは何ですか?

分類Dev

テンプレート化されたクラスconst修飾子コンストラクター

分類Dev

template <typename T>:静的データメンバーテンプレートのみが許可されます

分類Dev

ネストされたテンプレートパラメータをフラット化する方法は?

分類Dev

テンプレート化されたパラメーターを持つファンクターをテンプレート関数に渡す

分類Dev

テンプレートパラメータのT&とT &&の違いは何ですか?

分類Dev

テンプレート化された関数パラメーターを使用した暗黙的な型変換

分類Dev

すべてのテンプレート化されたクラスメソッドを実装する前に、なぜ「テンプレート<クラスT>」が必要なのですか?

分類Dev

テンプレートパラメータとして引数を持つテンプレート化された関数ポインタ

分類Dev

テンプレートパラメータとしてのテンプレート化された関数ポインタ

分類Dev

テンプレートテンプレートのパラメータとして部分的に満たされたテンプレート

分類Dev

別のテンプレートのパラメータを使用したカリー化テンプレート

分類Dev

テンプレートクラスは継承されたテンプレートメンバーを認識しません

分類Dev

テンプレート化されたクラス引数のテンプレートパラメータの推定:const issue

分類Dev

「T」はパラメータ「T」の有効なテンプレートタイプ引数ではありません

分類Dev

size_tパラメーターまたはメンバーへのポインターのいずれかを取ることができるテンプレートクラス

分類Dev

簡略化された関数テンプレートと転送参照パラメーターを含む関数テンプレート

分類Dev

C ++テンプレートtは有効なテンプレートタイプではありません

Related 関連記事

  1. 1

    テンプレートパラメータAAがテンプレート化されたクラスA <T>自体である場合、このテンプレート化されたクラスのテンプレートパラメータ(T)を取得することは可能ですか?

  2. 2

    <sizeof(T)>はc ++の継承されたクラステンプレートパラメータとして

  3. 3

    std :: if_enabled_tパラメーターを使用したテンプレート関数の完全な特殊化

  4. 4

    Clangは、部分的に特殊化されたテンプレートを解析しません。テンプレート<クラスT、クラスU = TYPE_A <T >>クラスTYPE_B;

  5. 5

    パラメータ(const T&、const T&)または(const char(&)[N]、const char(&)[M])を使用したオーバーロードされたテンプレートのあいまいな呼び出し

  6. 6

    テンプレートパラメータとしてのT []の使用

  7. 7

    `T`がテンプレートタイプパラメータである場合、ʻusing Base :: operator T`は許可されますか?

  8. 8

    C ++-14 enable_if_tを使用して、整数型でテンプレート化されたクラスのメンバー関数を選択します

  9. 9

    T4テンプレート内の単体テストにパラメーターを渡す

  10. 10

    テンプレート化されたスマートポインター型をテンプレートパラメーターとして渡す

  11. 11

    テンプレートの特殊化:Tとは異なるパラメーターを持つメンバー関数

  12. 12

    C ++の演算子T *(Tはテンプレートパラメーター)とは何ですか?

  13. 13

    テンプレート化されたクラスconst修飾子コンストラクター

  14. 14

    template <typename T>:静的データメンバーテンプレートのみが許可されます

  15. 15

    ネストされたテンプレートパラメータをフラット化する方法は?

  16. 16

    テンプレート化されたパラメーターを持つファンクターをテンプレート関数に渡す

  17. 17

    テンプレートパラメータのT&とT &&の違いは何ですか?

  18. 18

    テンプレート化された関数パラメーターを使用した暗黙的な型変換

  19. 19

    すべてのテンプレート化されたクラスメソッドを実装する前に、なぜ「テンプレート<クラスT>」が必要なのですか?

  20. 20

    テンプレートパラメータとして引数を持つテンプレート化された関数ポインタ

  21. 21

    テンプレートパラメータとしてのテンプレート化された関数ポインタ

  22. 22

    テンプレートテンプレートのパラメータとして部分的に満たされたテンプレート

  23. 23

    別のテンプレートのパラメータを使用したカリー化テンプレート

  24. 24

    テンプレートクラスは継承されたテンプレートメンバーを認識しません

  25. 25

    テンプレート化されたクラス引数のテンプレートパラメータの推定:const issue

  26. 26

    「T」はパラメータ「T」の有効なテンプレートタイプ引数ではありません

  27. 27

    size_tパラメーターまたはメンバーへのポインターのいずれかを取ることができるテンプレートクラス

  28. 28

    簡略化された関数テンプレートと転送参照パラメーターを含む関数テンプレート

  29. 29

    C ++テンプレートtは有効なテンプレートタイプではありません

ホットタグ

アーカイブ