2016-05-25 3 views
5

は、非常に多くの場合、特に図書館、形質クラスなどでのC++クラス定義では、次のスニペットのようなコードを参照してください。typenameテンプレートのパラメータが暗黙的に型として認識されないのはなぜですか?

template <typename Bar, typename Baz> 
class Foo { 
    using bar_type = Bar; 
    using baz_type = Baz; 
    // ... etc. 
} 

をそして唯一のこれらの行を後でFoo<A,B>::bar_typeまたはFoo<C,D>:baz_typeを参照することができます。私は疑問に思っています:なぜ、言語標準では、typenameテンプレートパラメータを使用して型を自動的に定義する必要がありません、そして、としてAFoo<C,D>::BazDと認識しますか?

Fooでは識別子バーとBazが既に使用されているため、既存のコードを破損すべきではありません。

+0

タイプではない可能性があります。たとえば、 'template の構造体配列NのNのような値かもしれません。 – davidbak

+5

これらは必ずしも必要ではなく、それらを公開するとクライアントコードが結合される可能性があります公衆になるエイリアスを意味しています。) – juanchopanza

+1

別の答え:それは自分自身を行うことは自明であるからです。誰かがなぜC++に 'super 'キーワードがないのか尋ねられたときの答えはどれですか(しかし私はそれを手元に置いていません)。 – davidbak

答えて

7

パラメータ名は、宣言されているエンティティの一部ではありません。これは、関数とテンプレートの両方に当てはまります。次のコードは完全に罰金であることを特に

extern void f(int, char, bool); 
extern void f(int a, char b, bool c); 
extern void f(int x, char b, bool z); 

template <typename> struct X; 
template <typename A> struct X; 
template <typename T> struct X; 

注:

template <typename T> struct X { void f(); }; // X<T>::f not yet defined 
template <typename U> void X<U>::f() {}   // now it's defined 

パラメータ名から付加的な構造を導き出すのすべての試みは、この状況に対処しなければならない次のコードは、2つのだけの別々の実体を宣言しています。この分野で最も一般的な要求の1つに関数パラメータという名前があります。今日まで、そのような拡張のための満足のいく提案はなかった。

このような提案は、ある程度、宣言されたエンティティのパラメータ名を作成する必要があります。たとえば、関数の場合、パラメータ名をマングルしてリンカーに公開する必要があるかどうかという疑問が生じます。

+0

誰が知っていますか。ファンクショナルシグネチャの一部となるパラメータの名前の隠れた影響の1つは、[Oracle](https://en.wikipedia.org/wiki/Oracle_America,_Inc._v._Google,_Inc。 )その上にあなたのお尻を訴える。 –

+0

私は何度も現状がどうなのかについて疑問を抱いている人々(あなたは明白なことではない)に何度も心を落とし、コメントをつけずに下降または投票を終わらせる - 完璧な合理的な答えがある – einpoklum

+0

@einpoklum:これは良い質問だと思うし、質問と答えを読んでくれてうれしいです。しかし、私が最初にそれを読んだときに、スタックオーバーフローに密接に関連しないように閉じる投票に誘惑されたことを認めなければならない。私が推測する理由は、「これはこれまでに提案されたものなのでしょうか?私は、C++への歴史的な質問は、SOに関するよくある質問をするとは思っていません。質問は、プログラミングや理想的には、学者や歴史家のIMOではなくプログラマーの関心が必要です。その行がなければ、私はおそらくそれを投票するでしょう。私は唯一のサンプルポイント、YMMVです。 –

関連する問題