访问模板构造函数和函数,包括静态和非静态

时间:2013-03-25 18:21:19

标签: c++ templates static

我是模板新手,发现这件事很混乱。我有一个模板类,用作将实体映射到字符串的表,我的类代码就像这样

template<class GENERIC_ENTITY> class EntityTable
{
private:

    map<wstring, GENERIC_ENTITY*> entityTable;

    // I want to put init in the default constructor so it gets initialized, but this doesn't compile 
    EntityTable<GENERIC_ENTITY>::EntityTable () {
        init();
    }

    void init()
    {
            entityTable[L"Entity1"] = new Entity1();
            entityTable[L"Entity2"] = new Entity2();
            entityTable[L"Entity3"] = new Entity3();
    }

public:

    // This function doesn't compile unless I remove the keyword static
    static template <class GENERIC_ENTITY> GENERIC_ENTITY retriveEntity(wstring identifier)
    {
        return entityTable[identifier];
    }
};

然后,我想在另一个类中调用此模板函数,并使用wstring标识符检索相应的实体。但不幸的是,无论函数是静态的,我都不能构造类或callig这个函数。它甚至没有编译。

如果函数是静态的,我想做EntityTable<T>::retriveEntity(wstring)之类的东西,如果不是静态的我想先实例化它,但我不知道如何用模板来做,因为我听说模板不是类。我将它声明为堆栈上的实际数据,所以我不必在构造函数上调用new,我不知道它是什么样的,但我仍然无法访问该函数。

我只是完全糊涂了,有人可以帮助我解决这个问题吗?

修改

BTW我在另一个类中声明此模板的方式是template<class GENERIC_BOT> EntityTable entityTable;。不确定这是否正确

所有Entity类都继承自两个公共类(纠正了一个错误)但这些类是抽象的,所以我不能通过像Entity retrieveEntity(wstring info)

那样实例化它

我希望这个类是一个单独的类,在它被初始化时构造它并调用静态函数eveywhere。施工后地图是不可变的。 wstring将传递给模板,模板将返回与该wstring标记关联的相应类。我只需要一个快速的回溯方式,给出表格很大的情况,为了方便,我只展示了两个项目。

P.S。 我知道我也可以使用if或switch语句返回相应的类型,但这很长且很麻烦并且无法使用地图

1 个答案:

答案 0 :(得分:1)

这应该编译好:

template<class GENERIC_ENTITY> class EntityTable
{
private:

    map<wstring, GENERIC_ENTITY*> entityTable;

    EntityTable::EntityTable () {
        init();
    }

    void init()
    {
            entityTable[L"Entity1"] = new Entity1();
            entityTable[L"Entity2"] = new Entity2();
            entityTable[L"Entity3"] = new Entity3();
    }

public:

    GENERIC_ENTITY* retriveEntity(wstring identifier)
    {
        return entityTable[identifier];
    }
};

如果您希望它是静态的,只需应用单例模式或声明entityTable static。在这种情况下,没有构造函数可用,init()也必须是静态的,并在代码中的某个点调用。单例将保证init()只被调用一次。