Typename
「typename」 であるキーワードでのC ++ プログラミング言語の書き込み時に使用されるテンプレートを。テンプレート定義または宣言の依存名が型であることを指定するために使用されます。 最初のISO標準が完成する前の元のC ++コンパイラでは、typenameキーワードはC ++言語の一部ではなく、BjarneStroustrupはclass代わりにテンプレート引数にキーワードを使用していました。一方でtypename、今の好適なキーワードである、古いソースコードはまだ使用することができますclass 代わりにキーワード(たとえば、1994年に公開されたBjarneStroustrupによるC ++の設計と進化と2013年に公開されたBjarneStroustrupによるC ++プログラミング言語:第4版のソースコード例の違いを参照してください)。
コンテンツ
1 テンプレートパラメータの「クラス」の同義語
2 従属名が型であることを示す方法
3 も参照してください
4 参考文献
classテンプレートパラメータの「」の同義語
「テンプレート」として知られるC ++のジェネリックプログラミング機能では、テンプレートパラメータを導入するために使用できます: typename
// 2つの引数の大きい方を返すジェネリック関数を定義しますtemplate < typename T > const T &max (const T &x 、const T &y )
{{ if (y < x )
xを返す; yを返す; }
このシナリオでの代替の意味的に同等のキーワードは ” class”:
// 2つの引数の大きい方を返すジェネリック関数を定義しますtemplate < class T > const T &max (const T &x 、const T &y )
{{ if (y < x )
xを返す; yを返す; }
従属名が型であることを示す方法
この無効なコードを考えてみましょう: <タイプ名T > void foo (const T &t ) {{ //タイプT :: bar T :: bar * p ;のオブジェクトへのポインタを宣言します }struct StructWithBarAsType{{ typedef int bar ; };int main () {{ StructWithBarAsType x ; foo (x );}
このコードはコンパイルする必要があるように見えますが、コンパイラがT::bar型か値かを認識していないため、正しくありません。それがわからない理由は、それT::barが「テンプレートパラメータ依存名」または略して「依存名」であり、これはfoo()に渡される型内の「bar」という名前のすべてを表すことができます。これにはtypedefが含まれる可能性が列挙型、変数など。
このあいまいさを解決するために、C ++言語標準は次のように宣言しています。の宣言または定義で使用され、template-parameterに依存する名前は、該当する名前ルックアップでタイプ名が検出されるか、名前がキーワードで修飾されていない限り、タイプに名前を付けないと見なされますtypename。
つまり、コンパイラーが従属名が値であるか型であるかを判別できない場合、コンパイラーはそれが値であると見なします。
この例でT::barは、は依存名です。これは、namedへのポインタを宣言するのではなく、次の行を意味します。T::barp
T :: bar * p;
代わりに、「値」T::barにp(どこにも見つからない)を掛けて、結果を破棄します。であるという事実StructWithBarAsTypeに依存するがbar、実際にあるので、タイプは解決しないfoo()長い前にコンパイルすることができStructWithBarAsType見られています。さらに、次のようなクラスもある場合:
struct StructWithBarAsValue{{ intバー; };
その場合、コンパイラは、インスタンス化されたときにT::barinfoo()をデータメンバーへのアクセスとして解釈する必要がありStructWithBarAsValue::barます。ただし、barは静的データメンバーではないため、エラーのフラグが立てられます。
この問題の解決策T::barは、実際には型であるコンパイラーに明示的に通知することです。このために、typenameキーワードが使用されます: <タイプ名T > void foo (const T &t ) {{ //は型Tのオブジェクトへのポインタ::バー宣言する型名T ::バー* pは、 } これで、コンパイラT::barはそれが型であることを確実に認識しp、その型のオブジェクトへのポインタを正しく作成します。
も参照してください
引数依存の名前ルックアップ–別のC ++名前ルックアップルール
参考文献
^ アルスティーブンス。「文書化されていないC ++」。ドブ博士の日記。pp。72–76。
^ TL Veldhuizen(2013)。「C ++テンプレートは完全にチューリング完全です」(PDF)。
^ “typenameキーワード(C ++のみ)”。IBM 。
^ “MSDN-typename”。MSDN 。
^ 「C ++テンプレートの依存名ルックアップ」。2012年2月6日。
^ 「テンプレートパラメータとしてのタイプ、非タイプ、およびテンプレート」。2019年3月4日。