SOの質問の1つに答えているときに、次のようなコードに出くわしました。
template<class T, class... Ts> void foo();
template <class T, class T::value_type>
void foo() { }
foo
テンプレート関数に特化したコードとして提示されましたが、これは正しくありませんが、ここでは私の問題ではありません。コンパイラclass T::value_type
がテンプレートパラメータで次のような構築を許可する理由を知りたいのですが。つまり、それは明らかに間違っています。スコープ演算子が引数名(テンプレートまたは関数)の一部である可能性があるという状況を思い付くことができません。そして、私には2つの質問があります。
コメントで述べたように、それは精巧な型指定子です。例で最もよく説明されています:
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/class
、enum
)は、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_type
、value_type
なくて、クラスであるclass
前に、それは価値だっただろうが。通常、 atypename
が使用されます。)
スコープ演算子が引数名の一部である可能性がある状況を思い付くことができません
ここでタイプテンプレートパラメータについて考えるのはあなただけです。型以外のテンプレートパラメータは、スコープ演算子を使用して型に名前を付けることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加