テンプレート引数の二重コロンが機能するのはなぜですか?

バートップ

SOの質問の1つに答えているときに、次のようなコードに出くわしました。

template<class T, class... Ts> void foo();

template <class T, class T::value_type>
void foo() { }

fooテンプレート関数に特化したコードとして提示されましたが、これは正しくありませんが、ここでは私の問題ではありません。コンパイラclass T::value_typeがテンプレートパラメータで次のような構築を許可する理由を知りたいのですが。つまり、それは明らかに間違っています。スコープ演算子が引数名(テンプレートまたは関数)の一部である可能性があるという状況を思い付くことができません。そして、私には2つの質問があります。

  1. 標準はそれを許可しますか、それともコンパイラで見落とされますか?
  2. 標準で許可されているのなら、なぜそうなのですか?ユースケースはありますか?
Rockets1111

コメントで述べたように、それは精巧な型指定子です。例で最もよく説明されています:

int main() {
    struct foo {}; // ok
    int foo = 0; // ok

    int test = foo; // ok, refers to variable 'foo'
    foo a; // error, 'foo' refers to variable
    struct foo b; // ok, 'struct' means that name lookup searches for classes only
}

本質的に、それら(struct/classenum)は、typenameそれぞれクラスまたは列挙型のみを許可するため、より制限されたものと考えることができますまたtypename、元の例で許可されいることに注意してください。

template<class T, class... Ts> void foo();

template <class T, typename T::value_type> // Ok, value_type needs to be a type
//                 ^^^^^^^^^^^^^^^^^^^^^^^ it's a non-type template parameter
void foo() { }

それはあなたが同じ名前を持つタイプと変数を持っていたときに必要とされている、またはあなたが依存名(すなわちである場合の事が何であるかを指定するためにclass T::value_typevalue_typeなくて、クラスであるclass前に、それは価値だっただろうが。通常、 atypenameが使用されます。)

スコープ演算子が引数名の一部である可能性がある状況を思い付くことができません

ここでタイプテンプレートパラメータについて考えるのはあなただけです。型以外のテンプレートパラメータは、スコープ演算子を使用して型に名前を付けることができます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

テンプレートでansibleが常に二重引用符を一重引用符に置き換えるのはなぜですか?

分類Dev

ステートメントの最後にJavaが二重セミコロンのエラーを表示しないのはなぜですか?

分類Dev

スクロール後にUITableViewCellに二重のコンテンツが表示されるのはなぜですか?(迅速)

分類Dev

データセットがsparklyrにあるのに、dplyrで二重コロン演算子を使用できないのはなぜですか?

分類Dev

データセットがsparklyrにあるのに、dplyrで二重コロン演算子を使用できないのはなぜですか?

分類Dev

Pythonで二重セミコロンがSyntaxErrorになるのはなぜですか?

分類Dev

関数テンプレートがint []で機能するのに、Dのchar []配列では機能しないのはなぜですか?

分類Dev

最初の2つのパラメーターのみが指定されている可変個引数テンプレートクラスでテンプレートパラメーターの推定が機能しないのはなぜですか?

分類Dev

ifステートメントで二重感嘆符を使用するのはなぜですか?

分類Dev

テンプレート引数の推定/置換がコードで失敗したのはなぜですか?-

分類Dev

std :: erase(std :: erase_if)がどのコンテナでも機能する<algorithm>のテンプレートではないのはなぜですか?

分類Dev

なぜ正規表現コンストラクタは二重にエスケープする必要があるのですか?

分類Dev

二重にリンクされたリストイテレータがnullを出力するのはなぜですか?

分類Dev

このブロックがERBテンプレートで機能しないのはなぜですか

分類Dev

暗黙の変換は、テンプレート引数のコンテキストで機能する必要がありますか?

分類Dev

この可変個引数テンプレートがエラーになるのはなぜですか?

分類Dev

C ++-変換関数テンプレートの推定、なぜこれが機能するのですか?

分類Dev

テンプレート引数の推論が失敗するのはなぜですか?

分類Dev

「破損した二重リンクリスト」エラーが発生するのはなぜですか?

分類Dev

二重比較がif条件で機能しないのはなぜですか?

分類Dev

外部テンプレートで使用しているときにv-onがVueコンポーネントで機能しないのはなぜですか?

分類Dev

テンプレート引数の推定/置換が関数テンプレートでのみ失敗するのはなぜですか?

分類Dev

オーバーロードされた関数でテンプレート引数の推定が失敗するのはなぜですか?

分類Dev

二重リンクリストの最初の値のみを出力し、プログラムがクラッシュするのはなぜですか

分類Dev

DjangoテンプレートがHTMLオートコンプリートの機能を妨げるのはなぜですか?

分類Dev

この関数ポインタで可変個引数テンプレートの引数の推定が失敗するのはなぜですか?

分類Dev

なぜ私のコードはすべてのテンプレートで機能しないのですか?

分類Dev

型以外のテンプレート引数が使用されるのはなぜですか?

分類Dev

「未定義」エラーが発生するのに、コードがMeteorテンプレートで機能しているのはなぜですか?

Related 関連記事

  1. 1

    テンプレートでansibleが常に二重引用符を一重引用符に置き換えるのはなぜですか?

  2. 2

    ステートメントの最後にJavaが二重セミコロンのエラーを表示しないのはなぜですか?

  3. 3

    スクロール後にUITableViewCellに二重のコンテンツが表示されるのはなぜですか?(迅速)

  4. 4

    データセットがsparklyrにあるのに、dplyrで二重コロン演算子を使用できないのはなぜですか?

  5. 5

    データセットがsparklyrにあるのに、dplyrで二重コロン演算子を使用できないのはなぜですか?

  6. 6

    Pythonで二重セミコロンがSyntaxErrorになるのはなぜですか?

  7. 7

    関数テンプレートがint []で機能するのに、Dのchar []配列では機能しないのはなぜですか?

  8. 8

    最初の2つのパラメーターのみが指定されている可変個引数テンプレートクラスでテンプレートパラメーターの推定が機能しないのはなぜですか?

  9. 9

    ifステートメントで二重感嘆符を使用するのはなぜですか?

  10. 10

    テンプレート引数の推定/置換がコードで失敗したのはなぜですか?-

  11. 11

    std :: erase(std :: erase_if)がどのコンテナでも機能する<algorithm>のテンプレートではないのはなぜですか?

  12. 12

    なぜ正規表現コンストラクタは二重にエスケープする必要があるのですか?

  13. 13

    二重にリンクされたリストイテレータがnullを出力するのはなぜですか?

  14. 14

    このブロックがERBテンプレートで機能しないのはなぜですか

  15. 15

    暗黙の変換は、テンプレート引数のコンテキストで機能する必要がありますか?

  16. 16

    この可変個引数テンプレートがエラーになるのはなぜですか?

  17. 17

    C ++-変換関数テンプレートの推定、なぜこれが機能するのですか?

  18. 18

    テンプレート引数の推論が失敗するのはなぜですか?

  19. 19

    「破損した二重リンクリスト」エラーが発生するのはなぜですか?

  20. 20

    二重比較がif条件で機能しないのはなぜですか?

  21. 21

    外部テンプレートで使用しているときにv-onがVueコンポーネントで機能しないのはなぜですか?

  22. 22

    テンプレート引数の推定/置換が関数テンプレートでのみ失敗するのはなぜですか?

  23. 23

    オーバーロードされた関数でテンプレート引数の推定が失敗するのはなぜですか?

  24. 24

    二重リンクリストの最初の値のみを出力し、プログラムがクラッシュするのはなぜですか

  25. 25

    DjangoテンプレートがHTMLオートコンプリートの機能を妨げるのはなぜですか?

  26. 26

    この関数ポインタで可変個引数テンプレートの引数の推定が失敗するのはなぜですか?

  27. 27

    なぜ私のコードはすべてのテンプレートで機能しないのですか?

  28. 28

    型以外のテンプレート引数が使用されるのはなぜですか?

  29. 29

    「未定義」エラーが発生するのに、コードがMeteorテンプレートで機能しているのはなぜですか?

ホットタグ

アーカイブ