※ ChatGPTを利用し、要約された質問です(原文:c++ , template , ファイル分割 , 助けてください...)
C++のファイル分割でコンパイルエラーが発生する原因と対処方法
このQ&Aのポイント
C++のファイル分割によるコンパイルエラーの原因は、テンプレートクラスの実装がヘッダーファイルに含まれているためです。
解決方法は、テンプレートクラスの実装を別のソースファイルに分離してコンパイルすることです。
具体的には、coord.cppにテンプレートクラスの実装を移動し、コンパイル時にそれを参照するように指定します。
c++ , template , ファイル分割 , 助けてください...
//-----------------coord.h-------------
template <class type>
class coord
{
type v[3];
public:
coord(void);
void Show(void);
};
//-----------------main.cpp------------
#include<iostream>
#include"coord.h"
using namespace std;
int main(void)
{
coord<double> ob;
ob.Show();
return 0;
}
//----------------------coord.cpp-----------
#include<iostream>
#include"coord.h"
using namespace std;
template <class type>
coord<type>::coord(void)
{
v[0]=v[1]=v[2]=0;
}
template <class type>
void coord<type>::Show(void)
{
cout << "hello" << endl;
}
同一フォルダ内に上記のファイルが 3 つあります.
つまり上の 3 つのファイルを分割してコンパイルさせたいです.
この状態で...MS-DOSプロンプトからコンパイルします.
C:\test>bcc32 -c coord.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
coord.cpp:
C:\test>bcc32 -c main.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
main.cpp:
C:\test>bcc32 -emain main.obj coord.obj
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'coord<double>::coord<double>()' が未解決(C:\USERS\TAITO\PR
OG\CPP\TEST\MAIN.OBJ が参照)
Error: 外部シンボル 'coord<double>::Show()' が未解決(C:\USERS\TAITO\PROG\CPP\TE
ST\MAIN.OBJ が参照)
すると, このようなエラー文が出てしまい
実行可能ファイルができません.
コンパイラはbccです.
原因が全く分かりません.
助けてください...
ちなみに,
分割せずにコンパイルすると通ります.
自分は c 言語での分割コンパイル経験はあるので
それをそのまま c++ 言語でも用いているのですが,
何か変えなければならないのでしょうか?
お礼
丁寧な回答真に感謝いたします. http://d.hatena.ne.jp/shizu9/20080726/1217092697 というページを参考にしたら なんとなくですが, template がファイル分割できない理由が分かった気がしました. 初心者は陥りやすいミスのような気がしますが, c++ で分割コンパイルを解説している書籍, サイトってすごく少ないですよね ^^; 普通にヘッダファイルに書こうと思います. ありがとうございました.