ページ 11

classとstructの違いについて

Posted: 2012年3月19日(月) 18:52
by MoNoQLoREATOR
質問掲示板のこの記事を見てふと思い出したので質問させていただきます。

上記でISLeさんは、classとstructの違いは「デフォルトでpublicかどうか」ということだけだと回答しておられますが、私はそれ以外にclassとstructの違いに出会った事があります。

以下classを用いた場合のソースコード
► スポイラーを表示
以下structを用いた場合のソースコード
► スポイラーを表示
classを用いた場合ではエラーも警告も出ませんが、structを用いた場合では以下のコンパイルエラーが出力されます。(VisualC++2008)
► スポイラーを表示
構造体や共用体は、クラスとは違い、テンプレート引数には指定できないようです。
これはclassとstructの「実行コードレベルの違い」と呼べるのではないでしょうか。
ちなみに、何故このようなルールになっているのでしょうか?

Re: classとstructの違いについて

Posted: 2012年3月19日(月) 20:06
by bitter_fox
MoNoQLoREATOR さんが書きました: 構造体や共用体は、クラスとは違い、テンプレート引数には指定できないようです。
structをclassに換えるとコンパイルできましたよ。

コード:

struct A{
    int i;
};
 
template<class T=A>
class B{
    T a;
};
 
int main(){}
http://ideone.com/RbZBb

あとC++ではmain関数の戻り値の型はintでなければいけませんよ。
http://www.kijineko.co.jp/tech/supersti ... -main.html

Re: classとstructの違いについて

Posted: 2012年3月19日(月) 20:14
by beatle
classとstructが、デフォルトのアクセス権限だけの違いだけ、という話は、「クラスを定義する場合のstructとclassキーワードについての話である」という暗黙の前提があると思います。
テンプレートの引数の「class」は、クラス定義でも何でもなく、テンプレート引数が「何かの型ですよ」という程度の意味です。
実際に

コード:

template<class T=A>
class B{
    T a;
};
の"class"は"typename"と置き換えられます。

テンプレートの機能はCにはなく、純粋なC++の機能ですから、Cとの互換性を保つ必要はなく、classだけの利用となっているのだろうと推測します。

Re: classとstructの違いについて

Posted: 2012年3月21日(水) 18:08
by MoNoQLoREATOR
返信ありがとうございます。

>>bitter_foxさん
わおっ。ホントですね。不思議です。
戻値がintでなければならないとは、初めて知りました。ありがとうございます。

>>beatleさん
「これはclassだ」というわけではなく、「これは型だ」ということを意味しているだけだったのですか。
ためしにテンプレート引数のclassの部分をtypenameに変えたりstructの部分をtypenameに変えてみたりしたところ、どちらもコンパイルが通りました。
「互換性がなくても良いからclassだけ」ということですか。なるほど・・・。


納得できました。ありがとうございました。