模板代码如下:
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。
答案 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;