2012-03-30 8 views
0
template<int n> 
struct Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
struct Numberim<0>{ 
    enum{ value = 0 }; 
}; 

これは単純なtmpの例です。テンプレートのメタプログラミング時の構造とクラスの違い

template<int n> 
class Numberim{ 
    enum{ value = Numberim<n-1>::value + n }; 
}; 

template<> 
class Numberim<0>{ 
    enum{ value = 0 }; 
}; 

私はコンパイルするG ++を使用し、それは、私の知る限りでは、構造体やクラスはC++で、「このように同じway.justにほとんど扱われ、しかし...との唯一の違いを不平を言います構造体とクラスは、構造体のメンバーはデフォルトでpublicであり、クラスのメンバーはデフォルトでprivateです。

だから、地球上のそれらの違いは何ですか?

+1

「それは文句ありません」 - それはどのように文句を言うのですか? –

+0

なぜ違いがあると思いますか? – josephthomas

+0

@Jesse g ++はこのように言っています "エラー: 'Numberim :: Numberim <22> :: value'はプライベートです。まあ...私はこの質問をするのが素朴だと思います。 –

答えて

3

違いは通常、クラスvs structと同じです。あなたの最初の例(構造体を使用)と2番目の例(クラスを使用して)のプライベートのためのあなたの "値"は公開されます。

クラスと構造体の違いについては、What are the differences between struct and class in C++を参照してください。

0

具体的なクラスNumberim<1>は、具体的なクラスNumberim<0>とは関係ありません。したがって

valuevalueは、それがclassするためのものであるprivateである場合、それはstructためではなく、public、ある場合に一つのクラスは、value作品の他の’の定義を参照有します。

あなたがfriendメカニズムを使用するか、valueを公開することもできますが、はるかに簡単に、行うことができますこの:

template<int n> 
class Numberim{ 
    enum{ value = n*(n+1)/2 }; 
    // And whatever else you want in here. 
}; 
0

それがでNumberim<n-1>::valueをコンパイルしようとしたときの違いは、まだ同じですn=1テンプレートの特殊化を使用しようとします。ただし、valueはのメンバーであるため、(デフォルトではクラスメンバー変数はprivateです)、コンパイラエラーが発生します。

関連する問題