2009-07-23 45 views
0

模板代码是这样的:如何使此模板代码有效?

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,字符串类型...

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

我得到è左“‘不用彷徨’必须有类/结构/联合”, 我不能找出问题出在哪里

当我改变到

objectCache<int> intcache; 

我得到 “ 'objectCache':没有可用的适当的默认构造函数”

使用

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

我被甩“ '不用彷徨' 中必须有类/结构/联合“。

+0

将objectCache(){}添加到objectCache类使其与objectCache一起使用< int > intcache; 现在我更了解模板感谢大家的回答。 – 2009-07-23 10:31:03

回答

7

在这里,你是不是传递参数给intcache构造:

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

这使得第一线恢复到著名的C "most vexing parse" ++,在短,您声明intcache是一个不带参数并返回objectCache<int>的函数。

也许你的意思是这样的:

objectCache<int> intcache; 

,不过也许你想传递一个工厂:

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

在最后一行中,您忘记了构造函数参数的括号。我解决了这个问题(奇怪 - 提问者也在他的问题中提到了这条线,并想知道由此产生的错误 - 他为什么不问你?)。我也想提一下'objectCache'的构造函数需要被改为不被非const引用接受,所以它可以接受临时的。 – 2009-07-24 01:02:22

1

你声明的是一个函数,而不是一个变量。试试这个:

objectCache<int> intcache; 
1

创建objectCache的目标似乎是错误的。它应该是:

objectCache<int> intcache;