0

名前付きの構造体を保持するためのリスト型が必要で、ポインターで表される同じ型の任意の数のメンバーが必要でした。完全なプロジェクト コードは Qt を使用します (それが重要な場合)。

だから私はこれを書いた:

/* 
 * This should be used with T as a pointer type.
 * Code gets really incomprehensible if T* value is used as member.
 */
template <typename T>
struct parameter_t {
    QString name;
    int count;
    T value;
};

template <typename T>
class Parameters {
private:
    typedef struct parameter_t< T > content_t; // beautification

public:
    void addParam(const QString &name, T value, int count);
private:
    std::list< content_t >* params;
};

typedef Parameters<float*> floatParameters; // beautification

実際の実装ではエラーのないコンパイルなどが行われるため、私には正当以上のように思えます。

今、別の場所から、次のように呼び出しています。

floatParameters* params = new floatParameters();
params->addParam("Ente", (float*) x, 1);

これにより、次のようなコンパイラ エラーが発生します。

In function `...': HelperClasses.cc:(.text+0x225): undefined reference to Parameters<float*>::addParam(QString const&, float*, int)'

ご覧のとおり、floatParameters を作成しているので、Parameters です。つまり、addParam メンバーは次のように変換する必要があります。

void addParam(const QString &name, float* value, int count);

このエラーが発生するのはなぜですか?

4

1 に答える 1

2

テンプレート関数は、ソース ファイルではなく、ヘッダー ファイルで定義する必要があります。テンプレートの実際のコードは、関数が使用されるまでビルドされないため、その時点で定義が利用可能である必要があります。そうでない場合、コンパイラはリンカーが後でそれを見つけることができると想定します。

于 2012-10-15T16:13:21.237 に答える