2012-01-12 10 views
0

struct(functor)内のあるタイプがtypedefのstructのローカルスコープである場合は、typedefです。2つの構造体(ファンクタ)のtypedefの範囲を理解する

次の例では、typdef'ed fooをintdoubleの2つの別々のファンクタにするとします。この例は正しいですか?

template <typename T> 
struct firstfunctor 
{ 
    typedef int foo; 

    foo operator()(const foo& a, const foo& b) 
    { 
    return /*whatever*/ 
    } 
}; 

template <typename T> 
struct secondfunctor 
{ 
    typedef double foo; 

    foo operator()(const foo& a, const foo& b) 
    { 
    return /*whatever*/ 
    } 
}; 

答えて

5

はい、のtypedefは、それぞれ、スコープ、あなたはメンバー種類firstfunctor::foosecondfunctor::fooを定義しています。

+0

+1、*メンバータイプのエイリアス*ですか? – Pubby

+0

@Pubby:多分。おそらくメンバのタイプ*名前*は良い言葉です...また、 'typename firstfunctor :: foo'と言わなければならないことを思い出させます:-) –

0

はい。

これは関数と名前空間にも適用されます。


タイプはfirstfunctor<>::fooです。 C++ 11のautoではこれを回避することができますが、これを非公開にすることはできます。

1

はい、typedefのスコープが設定されています。それらを使用するときは、スコープを指定する必要があります。

これは、オブジェクト、クラス、およびライブラリに適用されます。スコープは通常、{ }のセット内で定義されているものに限定されます。

0

はい、あなたがテンプレートにクラスに渡された(または、この場合でも、テンプレート)と取得する

typename X<T>::foo

を使用することができていることにより、興味深いメタプログラミング概念のためにそれらのtypedefを使用することができますあなたの "ダイナミック"タイプ。

ここで、Xはテンプレートテンプレートパラメーターです。