C++ 类模板中的虚函数

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(

我有一个名为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();

    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”=