2

編集:あなたの両方に感謝します!

現在、テンプレートリソースマネージャークラスを作成していますが、実際のコードにエラーは表示されませんが、コンパイルすると、これらのいくつかに見舞われます。

エラーC2227:「->getHandle」の左側はクラス/構造体/共用体/ジェネリック型を指している必要があります

template <class T>
unsigned int ResourceManager<T>::add(string& name, string& path)
{
    T* resource = getResource(name, path);

    if (resource != nullptr)
    {
        resource->incrementCount();    // doesn't like 
        return resource->getHandle();  // these lines calling member functions
    }
    else
        unsigned int handle;
        bool freeHandle = false;

        if (!m_freeHandles.empty())
        {
            handle = m_freeHandles.top();
            m_freeHandles.pop();
            freeHandle = true;
        }
        else
        {
            handle = m_resourceList.size();
            freeHandle = false;
        }

        T* newResource = new T(handle, name, path);

        if (!freeHandle)
            m_resourceList.push_back(newResource);
        else
            m_resourceList[handle] = newResource;

        return newResource->getHandle();
    }
    return -1;
}

リソースごとに、次のような基本クラスのリソースがあります。

class Resource
{
public:

Resource(unsigned int handle, string& name, string& path);
Resource(string& name, string& path);
virtual ~Resource();
string getFileName() { return m_filename; }
void setFileName(string filename) { m_filename = filename; }
string getFilePath() { return m_filepath; }
void getFilePath(string filePath) { m_filepath = filePath; }
string getName() { return m_name; }
void getName(string name) { m_name = name; }
unsigned int getHandle() { return m_handle; }
void setHandle(unsigned int handle) { m_handle = handle; }
void incrementCount() { m_referenceCount++; }
void decrementCount() { m_referenceCount--; }
int getReferenceCount() { return m_referenceCount; }

protected:

string m_filename;
string m_filepath;
string m_name;
unsigned int m_handle;
int m_referenceCount;
};

そして、私はこれからさまざまなリソースを引き出しています。

// just an abbreviated example
class Model : public Resource
{ };

ResourceManager<Model*> modelResourceManager;
modelResourceManager.add("model.obj", "models/");

ここに欠けているものはありますか?ResourceManager.hに「Resource.h」を含め、「model.h」などの特定の実装も含めましたが、それでもこのエラーが発生します。

それは非常に些細なことかもしれません、そして私はこれを完全に長すぎて見つめていましたが、助けていただければ幸いです。

4

2 に答える 2

3

resourceはですT*が、あなたの場合TModel*ですのでresource、タイプはModel**です。

于 2012-05-30T16:10:38.027 に答える
3

modelResourceManagerテンプレート引数をに設定してインスタンス化していますModel*。つまり、テンプレート化されたコードに含まれるのでT、(は)になります-つまり、pointer-to-pointer-to-になります。Model*resourcenewResourceT*Model**Model

したがってresource->、は有効ではありません。(*resource)->だろう; Modelまたは、テンプレート引数として使用するつもりだったのかもしれません。

于 2012-05-30T16:10:47.480 に答える