ページ 1 / 1
classとstructの違いについて
Posted: 2012年3月19日(月) 18:52
by MoNoQLoREATOR
質問掲示板の
この記事を見てふと思い出したので質問させていただきます。
上記でISLeさんは、classとstructの違いは「デフォルトでpublicかどうか」ということだけだと回答しておられますが、私はそれ以外にclassとstructの違いに出会った事があります。
以下classを用いた場合のソースコード
► スポイラーを表示
コード:
class A{
int i;
};
template<class T=A>
class B{
T a;
};
void main(){}
以下structを用いた場合のソースコード
► スポイラーを表示
コード:
struct A{
int i;
};
template<struct T=A>
class B{
T a;
};
void main(){}
classを用いた場合ではエラーも警告も出ませんが、structを用いた場合では以下のコンパイルエラーが出力されます。(VisualC++2008)
► スポイラーを表示
コード:
------ ビルド開始: プロジェクト: preTest, 構成: Debug Win32 ------
コンパイルしています...
main.cpp
c:\documents and settings\administrator\my documents\visual studio 2008\projects\pretest\main.cpp(3) : error C2993: 'T' : 非型テンプレート パラメータ '__formal' に対する無効な型です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\pretest\main.cpp(5) : error C2146: 構文エラー : ';' が、識別子 'a' の前に必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\pretest\main.cpp(6) : コンパイルされたクラスの テンプレート のインスタンス化 'B<__formal>' の参照を確認してください
c:\documents and settings\administrator\my documents\visual studio 2008\projects\pretest\main.cpp(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\my documents\visual studio 2008\projects\pretest\main.cpp(5) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\preTest\Debug\BuildLog.htm" に保存されました。
preTest - エラー 4、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
構造体や共用体は、クラスとは違い、テンプレート引数には指定できないようです。
これは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だけ」ということですか。なるほど・・・。
納得できました。ありがとうございました。