繁体   English   中英

C ++模板语法-使用指针分配类型

[英]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的。

我该如何进行内存分配

通过修复语法和语义错误。

  1. Generate返回类型为T ,但您返回T* 您可能想将返回类型更改为T* 因此,必须将返回的类型分配给T*变量。 由于您的TB* ,因此该变量必须具有类型B**
  2. 您尝试调用的非静态成员A没有实例。 而是使用实例调用成员。 另外,该成员是私人的。 公开。

修复代码后,您会看到它成功完成了内存分配。

或者您只能将以下内容定义为:

A<B> a;

不,还有更多定义方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM