如何使这个模板代码工作?

时间:2009-07-23 09:00:32

标签: c++ templates

模板代码如下:

template <class type1>
struct DefaultInstanceCreator {
    type1 * operator ()() {
        return new type1;
    }
};

template < class type1
, class InstanceCreator = DefaultInstanceCreator<type1> >
class objectCache 
{
    public:
        objectCache (InstanceCreator  & instCreator) 
          :instCreator_ (instCreator) {}
        type1* Get() {
            type1 * temp = instCreator_ ();
        }
    private:
        InstanceCreator instCreator_;
};

这段代码适用于这样的对象类:

class A{
public:
    A(int num){
        number = num;
    }
    int number;
    struct CreateInstance {
        CreateInstance (int value) : value_ (value) {}
        A * operator ()() const{
            return new A(value_);
        }
        int value_;
    };
};
objectCache< A, A::CreateInstance > intcache(A::CreateInstance(2));
    A* temp = intcache.Get();
    cout << temp->number <<endl;

当我尝试使用类型为int,string ...

的模板时
objectCache< int > intcache();
int* temp = intcache.Get();
*temp = 3;
cout <<temp <<endl;

我得到E'左'。'Get'必须有class / struct / union“, 我找不到问题在哪里

当我改为

objectCache< int > intcache;

我得到''objectCache':没有合适的默认构造函数“

使用

objectCache< int > intcache(DefaultInstanceCreator<int>());

我离开了''.Get'也必须有class / struct / union。

3 个答案:

答案 0 :(得分:7)

在这里,您没有将参数传递给intcache构造函数:

objectCache< int > intcache();
int* temp = intcache.Get();

这会导致第一行恢复为众所周知的C ++ "most vexing parse",简而言之,您将intcache声明为不带参数且返回objectCache<int>的函数。

也许你的意思是:

objectCache< int > intcache;

但可能你想通过一家工厂:

objectCache< int > intcache((DefaultInstanceCreator<int>()));

答案 1 :(得分:1)

您正在声明一个函数,而不是一个变量。试试这个:

objectCache< int > intcache;

答案 2 :(得分:1)

创建objectCache的对象似乎是错误的。它应该是:

objectCache<int> intcache;