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

时间:2015-06-10 12:01:27

标签: c++ templates

我该怎么做这样的内存分配:

template <class T>
class A
{
  T Generate()
  {
    return new T();    // Error
  }
};

A<B *> a;
B * pI = A.Generate();

或者您只能将某些内容定义为:

A<B> a;

4 个答案:

答案 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)

  

如何进行像这样的内存分配

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

  1. Generate的返回类型为T,但您返回T*。您可能希望将返回类型更改为T*。因此,您必须将返回的类型分配给T*变量。由于您的TB*,因此该变量的类型必须为B**
  2. 您尝试在没有实例的情况下调用A的非静态成员。使用实例调用成员。此外,该成员是私人的。公开。
  3. 当您修复代码后,您会发现它已成功进行内存分配。

      

    或者您只能将某些内容定义为:

    A<B> a;
    

    不,还有很多方法可以定义。