C++ 类模板中的虚函数
我有一个名为Cache的模板类,它是字符串和对象的std::map的持有者C++ 类模板中的虚函数,c++,templates,C++,Templates,我有一个名为Cache的模板类,它是字符串和对象的std::map的持有者 template<class T> class Cache { public: Cache() {} virtual ~Cache(); virtual T* loadObject(const char *file); virtual bool removeObject(const char *file); virtual void removeAllObjects(
template<class T>
class Cache
{
public:
Cache() {}
virtual ~Cache();
virtual T* loadObject(const char *file);
virtual bool removeObject(const char *file);
virtual void removeAllObjects();
virtual unsigned int getNumObjects() const;
virtual T* getObject(const char *file);
protected:
typedef std::shared_ptr<T> t_ptr;
std::unordered_map<std::string, t_ptr> _objects; //file, shared ptr of object
};
template<class T>
T* Cache<T>::loadObject(const char *file)
{
//if object exists
T *obj = getObject(file);
if(obj)
return obj;
obj = new T();
if(obj)
return _objects.insert(std::make_pair(file,t_ptr(obj))).first->second.get();
else
return nullptr;
}
在我的程序中,我启动ResourceCache,将T设置为一个名为Mesh的类,该类的构造函数中有一个参数。现在,当我试图编译我的程序时,编译器会抱怨:
错误C2512:“网格”:没有合适的默认构造函数可用
这就像它试图为缓存而不是ResourceCache构建代码。但是当我在Cache::loadObject()之前省略virtual关键字时,程序将编译
为什么会发生这种情况?我学会了在执行继承时始终使用virtual关键字。是的,它正在尝试构建缓存,因为这是您告诉编译器在某一点上要做的:
class ResourceCache : public Cache<T>
类资源缓存:公共缓存
在T为实际类型时,编译器需要实例化缓存,其中包括方法Cache::loadObject,如果T没有默认构造函数,则该方法不会编译
您可以使基类的loadObject为纯虚拟的,然后从抽象类派生一个额外的类,该抽象类实现了您设置为默认值的旧loadObject方法 是的,它正在尝试构建缓存,因为这是您告诉编译器在某一点上要做的:
class ResourceCache : public Cache<T>
类资源缓存:公共缓存
在T为实际类型时,编译器需要实例化缓存,其中包括方法Cache::loadObject,如果T没有默认构造函数,则该方法不会编译
您可以使基类的loadObject为纯虚拟的,然后从抽象类派生一个额外的类,该抽象类实现了您设置为默认值的旧loadObject方法 是的,它正在尝试构建缓存,因为这是您告诉编译器在某一点上要做的:
class ResourceCache : public Cache<T>
类资源缓存:公共缓存
在T为实际类型时,编译器需要实例化缓存,其中包括方法Cache::loadObject,如果T没有默认构造函数,则该方法不会编译
您可以使基类的loadObject为纯虚拟的,然后从抽象类派生一个额外的类,该抽象类实现了您设置为默认值的旧loadObject方法 是的,它正在尝试构建缓存,因为这是您告诉编译器在某一点上要做的:
class ResourceCache : public Cache<T>
类资源缓存:公共缓存
在T为实际类型时,编译器需要实例化缓存,其中包括方法Cache::loadObject,如果T没有默认构造函数,则该方法不会编译
您可以使基类的loadObject为纯虚拟的,然后从抽象类派生一个额外的类,该抽象类实现了您设置为默认值的旧loadObject方法 在缓存::加载对象()
中,您有一行
obj = new T();
如果t
,Mesh
没有默认构造函数,则该行不起作用
当Cache::loadObject()
为virtual
时,函数的基类实现和派生类实现都将实例化
当Cache::loadObject()
不是virtual
时,只实例化函数的派生类实现。函数的基类实现只有在显式使用时才会实例化。在Cache::loadObject()
中,您有一行
obj = new T();
如果没有默认构造函数,则该行将无法工作
当Cache::loadObject()
为virtual
时,函数的基类实现和派生类实现都将实例化
当Cache::loadObject()
不是virtual
时,只实例化函数的派生类实现。函数的基类实现只有在显式使用时才会实例化。在Cache::loadObject()
中,您有一行
obj = new T();
如果t
,Mesh
没有默认构造函数,则该行不起作用
当Cache::loadObject()
为virtual
时,函数的基类实现和派生类实现都将实例化
当Cache::loadObject()
不是virtual
时,只实例化函数的派生类实现。函数的基类实现只有在显式使用时才会实例化。在Cache::loadObject()
中,您有一行
obj = new T();
如果t
,Mesh
没有默认构造函数,则该行不起作用
当Cache::loadObject()
为virtual
时,函数的基类实现和派生类实现都将实例化
当
Cache::loadObject()
不是virtual
时,只实例化函数的派生类实现。函数的基类实现只有在显式使用时才会实例化。什么是Mesh
?它是否提供默认构造函数?不,它不提供。这就是重点。它试图为“obj=newmesh();”构建代码,而我实际上希望它构建“obj=\u resourceLoader->load(file);”什么是Mesh
?它提供默认构造函数吗?不提供。这就是重点。它试图为“obj=newmesh();”构建代码,而我实际上希望它构建“obj=\u resourceLoader->load(file);”什么是Mesh
?它是否提供默认构造函数?不,它不提供。这就是重点。它试图为“obj=newmesh();”构建代码,而我实际上希望它构建“obj”=