![](/img/trans.png)
[英]C++ templating, passing a function pointer with a parameterized return type
[英]C++ templating syntax - allocate type with pointer
我该如何进行内存分配:
template <class T>
class A
{
T Generate()
{
return new T(); // Error
}
};
A<B *> a;
B * pI = A.Generate();
或者您只能将以下内容定义为:
A<B> a;
如果我对您的理解正确,则希望对指针类型使用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
};
您的代码有很多问题:
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**
new
将返回一个指针,因此您需要签名
T* Generate()
{
return new T();
}
如果您想在课程之外调用此函数,则该函数也必须是public
的。
我该如何进行内存分配
通过修复语法和语义错误。
Generate
返回类型为T
,但您返回T*
。 您可能想将返回类型更改为T*
。 因此,必须将返回的类型分配给T*
变量。 由于您的T
为B*
,因此该变量必须具有类型B**
。 A
没有实例。 而是使用实例调用成员。 另外,该成员是私人的。 公开。 修复代码后,您会看到它成功完成了内存分配。
或者您只能将以下内容定义为:
A<B> a;
不,还有更多定义方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.