classとstructの違いについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

classとstructの違いについて

#1

投稿記事 by MoNoQLoREATOR » 12年前

質問掲示板のこの記事を見てふと思い出したので質問させていただきます。

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

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

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

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

#2

投稿記事 by bitter_fox » 12年前

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

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

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

#3

投稿記事 by beatle » 12年前

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

コード:

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

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

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#4

投稿記事 by MoNoQLoREATOR » 12年前

返信ありがとうございます。

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

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


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

閉鎖

“C言語何でも質問掲示板” へ戻る