テンプレートクラスで分割コンパイル

[戻る]
goto 2002/02/16(土) 01:17:52
みなさん初めまして。
ただいま、私はVC++6.0でtemplateとSTLの勉強を合わせて行っているのですが、
以下のソースでLNK2001(リンクエラー)が発生してしまい、
原因が分からずに困っています。どなたか、助けてください。
これらのソースファイルはいずれも同じディレクトリ上にあります。
よろしくお願いします。

//a.h
template <typename Type>
class CHogeHoge {
private:
    Type m_var;
public:
    void set(Type);/*このシンボルが未解決だと言われます。*/
    Type get();    /*このシンボルが未解決だと言われます。*/
};

//a.cpp
#include "a.h"

template <typename Type>
void CHogeHoge<Type>::set(Type Var) {
    m_var = Type;
}

template <typename Type>
Type CHogeHoge<Type>::get() {
    return m_var;
}

//a1.cpp
#include <iostream.h>
#include "a.h"

void main( void )
{
    CHogeHoge<int> hoge;
    hoge.set(1);
    cout << hoge.get() << endl;
}

※あと関係ないのですが、私はtemplateのデメリットというのを
聞いたことがないです。もしあるのならそちらのほうも教えていただければ幸いです。

YuO [E-Mail] 2002/02/16(土) 06:26:50
a.cppの内容は全てa.h内に書かれている必要があります。

デメリットは,全てinline展開されるので同じ関数が複数の翻訳単位に存在したりして,
ファイルサイズが簡単に膨れ上がることです。
あと,実装を隠せない,というのもありますね。

goto 2002/02/16(土) 18:16:40
[[解決]]
回答ありがとうございます。
指摘の通り書き直して、コンパイルエラーを取り除けば
リンクがうまく通りました。

なぜ通常のクラスと同様にできないのか、
その辺の疑問は残りますが、そんなものだと
思うことにします。

templateのデメリットについてのご教授もありがとうございました。

古いスレッドには追加発言できません。