2

我实现了一个模板单例类以及静态成员定义:

template <typename T> class SingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = new T;
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T> T *SingletonT<T>::s_instance = 0;

它编译得很好并且工作正常。现在,我正在尝试创建一个将使用自定义函数而不是 operator 的单例new

template <typename T, T *(*f)()> class PolymorphSingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = f();
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T, T *(*f)()> T *PolymorphSingletonT<T, T *(*f)()>::s_instance = 0;

我在最后一行说编译错误error C2146: syntax error : missing ')' before identifier 'f'

我使用 MSVC2005 编译器。

更新 现在我结束了仿函数方法:

template <typename T, typename F> class PolymorphSingletonT
{
public:
    static T *GetInstance()
    {
        if (!s_instance)
        {
            s_instance = F::Create();
        }
        return s_instance;
    }
private:
    static T *s_instance;
};
template <typename T, typename F> T *PolymorphSingletonT<T, F>::s_instance = 0;

但是,它迫使我用仿函数包装我的创建函数。它只添加了几行代码并且运行良好,但无论如何我仍然有兴趣在没有仿函数的情况下获得它。

4

1 回答 1

3

最后一行应该是:

template <typename T, T *(*f)()> T *PolymorphSingletonT<T,f>::s_instance = 0;

不要重复类型签名,使用您指定的名称。

于 2012-11-24T17:10:42.563 回答