アプリ版:「スタンプのみでお礼する」機能のリリースについて

VC++2003の環境なんですが、
下記の状態でtest2.a()を呼び出すと未解決の外部シンボル(LNK2019)のエラーが発生します。同じファイルでこれらを定義した場合は普通に通りました。class内で定義した場合も通ります。なぜでしょうか?

test1.h :
template<class T>
class test1
{
public:
void a();
};

test1.cpp :
template <class T> void test1<T>::a(){}

test2.cpp :
class test2 : public test1<int>
{public:};

A 回答 (4件)

test1.cpp のコンパイル時、template引数 T が確定していないので


コードが生成できないのです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
#include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。

お礼日時:2009/11/29 13:08

> 書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。



了解です。使われる(テンプレート引数が確定する)時点で定義(実装)が存在しないとコンパイルできないからです。

# inline とは意味合いが違いますけども。
    • good
    • 0
この回答へのお礼

理解できました。ありがとうございます。

お礼日時:2009/11/29 18:11

> #include "vector"などのclass内の関数が直接(関数に渡す形で)定義されていたことを思い出しましたが、理由はこれですか。



何言ってるのかわかりません。
    • good
    • 0
この回答へのお礼

stlのVc7\include\vectorファイルのことですが
下記のように書かれたclassの全ての関数はインラインメンバー関数(>>直接定義)になっているということですが、その理由はなんだろなと考えてみました。

template<class ***>
class vector<***,***>
{***};

お礼日時:2009/11/29 14:54

とりあえず, 「きちんとコンパイルできるプログラム」を例に挙げるようお願いします.


といっておくけど, template の場合は「必要なものが必要なところで見えないとエラーになる可能性が高い」んだよね. ある意味では inline と同じようなものか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
確かにinlineはclassとかで不用意に書くとエラーが出ますね。

お礼日時:2009/11/29 13:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!