2

クラスのコンストラクターに関数ポインターを渡そうとしています。ただし、コードをコンパイルしようとすると、エラーが発生します。コードとエラーは次のとおりです。

quickfind.h

#ifndef QUICKFIND_H
#define QUICKFIND_H
#endif // QUICKFIND_H

template <class T>
class QuickFind
{
private:
    int size;
    int *array;
    int (*giveIndex)(const void *a);
public:
    QuickFind<T>(int n,int (*ptr)(const void *));
    void connect (const T* u,const T* v);
    bool isConnected(const T* u,const T* v);
};

ファイル quickfind.cpp のコンストラクター定義

template <class T>
QuickFind<T>::QuickFind(int n,int (*ptr)(const void *))
{
    size=n;
    array=new int[n];
    giveIndex=ptr;
    for(int i=0;i<n;i++)
    {
        array[i]=i;
    }
}

私のメイン関数ファイルでは:

int giveIndex (const void *ptr)
{
    temp *tptr=(temp*)ptr;
    return tptr->getA();
}

int main()
{
     QuickFind<temp> *qf=new QuickFind<temp>(10,giveIndex);
}

ここで、'undefined reference to QuickFind<temp>::QuickFind(int, int (*)(void const*))'エラーが発生しています。私は問題を理解することができません...助けてください。

4

3 に答える 3

2

次のすべてを 1 つの CPP ファイルに入れて、動作することを確認します。他のコメントで述べたように、テンプレート化されたクラスの場合、定義全体をヘッダー ファイルに配置する必要があります。関数宣言をその定義から別の CPP ファイルに分離しないでください。この場合、実装全体を 1 つの CPP ファイルに含めることは、同じ目的を果たします。

タイプセーフ、メモリ リーク セーフ、およびより例外セーフにするために、コードにいくつかの変更を加えました。たとえば、動的に割り当てられた配列を std::vector に置き換えました。std::vector には必要なすべての機能がありますが、メモリを管理し、クラスが範囲外になるとクリーンアップされます。

#include <vector>
#include <iostream>
#include <functional>

template <typename T>
class QuickFind
{
private:
    std::vector<int> data;
std::function<int (const T&)> func;
public:
    QuickFind(int n, std::function<int (const T&)> f) : data(n), func(f)
    {
        int i = 0;
        for(auto it = data.begin(); it != data.end(); ++it)
            data[i]=i++;
    }

    void connect (const T& u, const T& v)
    {
        std::cout << func(u) << "\n";
        std::cout << func(v) << "\n";
    }
    bool isConnected(const T* u,const T* v);
};

class temp
{
    int val;
public:
    temp(int i) : val(i)
    {}

    int getA() const
    {
        return val;
    }
};

int giveIndex (const temp &t)
{
    return t.getA();
}

int main()
{
     temp t1(5), t2(10);

     QuickFind<temp> qf1(10,giveIndex);
     qf1.connect(t1, t2);

     // this example uses a lambda as the callback
 auto giveIndex2 = [](const temp& t) { return t.getA(); };
 QuickFind<temp> qf2(20, giveIndex2);
 qf2.connect(t1, t2);
}
于 2013-04-06T16:56:30.257 に答える