我该怎么做这样的内存分配:
template <class T>
class A
{
T Generate()
{
return new T(); // Error
}
};
A<B *> a;
B * pI = A.Generate();
或者您只能将某些内容定义为:
A<B> a;
答案 0 :(得分:3)
如果我理解正确,你希望对指针类型有A的特化。尝试类似:
#include <cstdio>
template <class T>
class A
{
public:
T *Generate()
{
printf("A\n");
return new T; // Error
}
};
template <class T>
class A<T*> {
public:
T *Generate() {
printf("Specialization of A\n");
return new T;
}
};
class B {
};
int main() {
A<B *> a;
B * pI = a.Generate();
}
修改强>
仅“覆盖”部分功能:
template <class T>
class Generator
{
public:
T *Generate()
{
printf("Generator\n");
return new T; // Error
}
};
template <class T>
class Generator<T*> {
public:
T *Generate() {
printf("Specialization of Generator\n");
return new T;
}
};
template <class T>
class A: public Generator<T>
{
public:
// does some other stuff
};
答案 1 :(得分:1)
您的代码存在许多问题:
A.Generate()
应为a.Generate()
,因为Generate
是会员功能。
new T()
会返回T*
,因此您的Generate
函数应如下所示:
T* Generate()
{
return new T();
}
这也应反映在您的使用中:
A<B *> a;
B ** pI = a.Generate(); //generator for B* returns B**
答案 2 :(得分:0)
new
将返回一个指针,因此您需要签名
T* Generate()
{
return new T();
}
如果您想在课堂外拨打电话,此功能也必须为public
。
答案 3 :(得分:0)
如何进行像这样的内存分配
通过修复语法和语义错误。
Generate
的返回类型为T
,但您返回T*
。您可能希望将返回类型更改为T*
。因此,您必须将返回的类型分配给T*
变量。由于您的T
为B*
,因此该变量的类型必须为B**
。A
的非静态成员。使用实例调用成员。此外,该成员是私人的。公开。当您修复代码后,您会发现它已成功进行内存分配。
或者您只能将某些内容定义为:
A<B> a;
不,还有很多方法可以定义。