次のタイプのリンケージ エラーが発生します。
Festival.obj : エラー LNK2019: 未解決の外部シンボル "public: void __thiscall Tree::add(class Price &)" (?add@?$Tree@VPrice@@@@QAEXAAVPrice@@@Z) 関数 __catch$ で参照されています? AddBand@Festival@@QAE?AW4StatusType@@HHH@Z$0
以前は、try-catch メカニズムに関係していると思っていましたが、そうではないと言われました。これは質問の更新版です。
Visual Studio 2008 を使用していますが、g++ でも同様の問題があります。
関連するコード:
Festival.cpp で
#include "Tree.h"
#include <exception>
using namespace std;
class Band{
public:
Band(int bandID, int price, int votes=0): bandID(bandID), price(price), votes(votes){};
...
private:
...
};
class Festival{
public:
Festival(int budget): budget(budget), minPrice(0), maxNeededBudget(0), priceOffset(0), bandCounter(0){};
~Festival();
StatusType AddBand(int bandID, int price, int votes=0);
...
private:
Tree<Band> bandTree;
...
};
StatusType Festival::AddBand(int bandID, int price, int votes){
if ((price<0)||(bandID<0)){
return INVALID_INPUT;
}
Band* newBand=NULL;
try{
newBand=new Band(bandID,price-priceOffset,votes);
}
catch(bad_alloc&){return ALLOCATION_ERROR;}
if (bandTree.find(*newBand)!=NULL){
delete newBand;
return FAILURE;
}
bandTree.add(*newBand);
....
}
Tree.h で:
template<class T>
class Tree{
public:
Tree(T* initialData=NULL, Tree<T>* initialFather=NULL);
void add(T& newData);
....
private:
....
};
興味深いことに、型 T が int のようなプリミティブ型であるときに Tree 関数を使用しようとしても、リンケージ エラーは発生しません。