C++テンプレート宣言と定義
1.クラステンプレートを利用したクラスの書き方
C++テンプレートを利用したクラスを初めて書いてみた。
とろが、リンクでエラー。
いくつか存在するC++のサイトサンプルに従い作ったがうまくいかない。
色々調べた結果、以下のことがわかった。
・クラステンプレートを利用したい場合、よくやるクラスメンバの
定義と異なりクラスメンバの定義もヘッダファイルに記述する
必要がある。(-->要はヘッダで完結しソースファイルを作らない)
・externをつけるとソースファイル(.cpp)に書くことも可能らしい。
但し、externに対応しているコンパイラが多くないため、いい方法では
ないらしい。(VisualStudio2005はだめらしい)
これは知らないとプログラムがビルドできない知識なのに、書いていない
サイト(書籍)が結構ある。んーなんでだろ?
とりあえず自分がリファレンスとして利用している 手元の書籍には書いて
無いっぽい。C++の言語仕様が複雑なため、網羅し切れていないケースも
少ないということなのか?
Effective C++など有名な書籍を読めばそれくらいのこと書いてあるのかな。
例:
そういえば、テンプレートはデストラクタ関連で何か制限があるとか
どこかに書いてあったような...。なんだっけなあ...。
2.ヘッダファイル拡張子
ヘッダファイル拡張子の慣習の中には、以下のような慣習があるらしい。
・".h" はクラス定義(クラスメンバ宣言のみ)のコードに用いる。
テンプレートを用いない場合のクラスの書き方はこれにあたる。
・".hpp" はクラス定義(クラスメンバ定義も含む)の場合使うらしい。
通常ソースファイル".cpp"に記述するクラスメンバ定義も含むため、
".hpp"になるのだそうな。
このルール、どこかに出典があるのかな?
boost C++ libraryは.hppが多いが、このルールに則っているのか?
3.C++の宣言と定義
テンプレート調べている内に、C++における"宣言"と"定義"を
よくわかっていないことに気づき、調べてみた。
調べた結果、以下のようになるらしい。
・クラス宣言
・クラス定義
私がわからなかったのはソースファイルの内容は何なのかという
ところなんだけど、上記の情報から判断するとソースファイルに
記述されるのは クラスメンバの定義 なんだろうなあ。
じゃあ クラスメンバの宣言 は?というとこれは クラス定義 内の
関数記述がこれに当たると。
C++テンプレートを利用したクラスを初めて書いてみた。
とろが、リンクでエラー。
いくつか存在するC++のサイトサンプルに従い作ったがうまくいかない。
色々調べた結果、以下のことがわかった。
・クラステンプレートを利用したい場合、よくやるクラスメンバの
定義と異なりクラスメンバの定義もヘッダファイルに記述する
必要がある。(-->要はヘッダで完結しソースファイルを作らない)
・externをつけるとソースファイル(.cpp)に書くことも可能らしい。
但し、externに対応しているコンパイラが多くないため、いい方法では
ないらしい。(VisualStudio2005はだめらしい)
これは知らないとプログラムがビルドできない知識なのに、書いていない
サイト(書籍)が結構ある。んーなんでだろ?
とりあえず自分がリファレンスとして利用している 手元の書籍には書いて
無いっぽい。C++の言語仕様が複雑なため、網羅し切れていないケースも
少ないということなのか?
Effective C++など有名な書籍を読めばそれくらいのこと書いてあるのかな。
例:
// ★クラステンプレートの利用(ヘッダファイルで完結する必要がある)
// .hppファイル
template<int R, int C>
class Matrix
{
public:
Matrix();
~Matrix();
void func();
};
template<int R, int C>
Matrix<R, C>::Matrix()
{
// コンストラクタ
}
template<int R, int C>
Matrix<R, C>::~Matrix()
{
// デストラクタ
}
template<int R, int C>
void Matrix<R, C>::func()
{
// メンバ関数
}
// .hppファイル終わり
そういえば、テンプレートはデストラクタ関連で何か制限があるとか
どこかに書いてあったような...。なんだっけなあ...。
2.ヘッダファイル拡張子
ヘッダファイル拡張子の慣習の中には、以下のような慣習があるらしい。
・".h" はクラス定義(クラスメンバ宣言のみ)のコードに用いる。
テンプレートを用いない場合のクラスの書き方はこれにあたる。
・".hpp" はクラス定義(クラスメンバ定義も含む)の場合使うらしい。
通常ソースファイル".cpp"に記述するクラスメンバ定義も含むため、
".hpp"になるのだそうな。
このルール、どこかに出典があるのかな?
boost C++ libraryは.hppが多いが、このルールに則っているのか?
3.C++の宣言と定義
テンプレート調べている内に、C++における"宣言"と"定義"を
よくわかっていないことに気づき、調べてみた。
調べた結果、以下のようになるらしい。
・クラス宣言
class Test;
・クラス定義
// .hファイル内
class Test
{
public:
Test();
virtual ~Test();
void func();
};
私がわからなかったのはソースファイルの内容は何なのかという
ところなんだけど、上記の情報から判断するとソースファイルに
記述されるのは クラスメンバの定義 なんだろうなあ。
じゃあ クラスメンバの宣言 は?というとこれは クラス定義 内の
関数記述がこれに当たると。
// .hファイル内
class Test
{
public:
Test();
virtual ~Test();
void func(); // <-- これはクラスメンバの宣言
};
// .cppファイル内
// これはクラスメンバの定義
void Test::func()
{
;
}
コメント