質問掲示板の
この記事を見てふと思い出したので質問させていただきます。
上記で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の「実行コードレベルの違い」と呼べるのではないでしょうか。
ちなみに、何故このようなルールになっているのでしょうか?