簡體   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