電脳館
〜みやのHP Ver.2.2〜

+10000ぐらい。
since 2000.04.13



あばうと 電脳館

昔のひとりごと

コラム

電算室
 まじっく☆ぱにっく
 Destroy Block
 やまづくり
 インラインアセンブラについて
 DirectX解説書
 libjpegメモ
 その他のソフトウェア

遊戯室
YS Flight Simulator

掲示板

リンク


mail

ひとりごと
2005年10月11日 23:41 (1月に沖縄で国際会議)


プログラムでtemplate使っててリンクエラーが出た.それ関連.


○例1
・hoge.h
#pragma once
template <typename T> class hoge {
public:
  T func (T a, T b) {return a + b;}
};
・main.cpp
#include <iostream>
#include "hoge.h"
int main (void) {
  hoge<int> a;
  std::cout << a.func (10, 20) << std::endl;
  return 0;
}
・問題なく通る.出力結果は30.


○例2
・hoge.h
#pragma once
template <typename T> class hoge {
public:
  T func (T a, T b);
};
・hoge.cpp
#include "hoge.h"
template <typename T> T hoge::func (T a, T b) {return a + b;}
・main.cpp
 さっきと同じ
・これでコンパイルするとリンクエラー


○原因
・hoge.cppコンパイル時にはTが何かわからないのでfuncの実体が生成されない
   ↓
・main.cppコンパイル時にはfunc<int>がどこかに存在するものとしてコンパイル
   ↓
・どこにも実体は無いのでリンク時にエラー


○解決策
 hoge.cppコンパイル時に明示的にインスタンス化させる.
・hoge.h
 さっきと同じ
・hoge.cpp
#include "hoge.h"
template class hoge<int>;
template <typename T> T hoge::func (T a, T b) {return a + b;}
・main.cpp
 さっきと同じ
・これで問題なし.ただし,double型やfloat型にするときは実体を生成するように
 またhoge.cppに明示的に記述する必要があり面倒
・あまりにも面倒ならヘッダファイルにインライン展開って手段が・・・


○参考
【C++】template 統合スレ -- Part6 の300あたり



みや@木更津OB
高専生 web Ring
PREV RANDOM NEXT
webRing

teacup RINTEN HSP
Google