我目前正在创建一个模板资源管理器类,它在实际代码中没有显示任何错误,但是当我编译时,我会遇到其中一些
错误C2227:' - > getHandle'的左边必须指向class / struct / union / generic type
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”,但我仍然遇到这个错误。
这可能是非常微不足道的,我只是一直盯着这个太长时间但是非常感谢帮助。
答案 0 :(得分:3)
resource
是T*
,但在您的情况下,T
为Model*
,因此resource
的类型为Model**
。
答案 1 :(得分:3)
您将模板参数设置为modelResourceManager
来实例化Model*
。也就是说,T
在您的模板化代码中将为Model*
,因此resource
和newResource
(T*
}将为Model**
- 是,指针指向 - Model
。
所以resource->
无效。 (*resource)->
会是;或者您可能打算使用Model
作为模板参数。