C++テンプレート宣言と定義

1.クラステンプレートを利用したクラスの書き方
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()
{
 ;
}

コメント

このブログの人気の投稿

日食ツアーその後

NashornがOpenJDKのリポジトリに入ってたのでビルドしてみた

Javaのクロージャをいじってみた。(1)