簡體   English   中英

需要有關模板 class 實例化的幫助

[英]Need help regarding Template class instantiation

讓我用一個例子來說明我的問題:

template <typename T> class a{
public:
    T data;
    a():data(T()){}
    a(T temp): data(temp) {}
};

所以如果寫在main()之類的

a(30);
a("String");

所以根據模板參數推導規則,應該可以生成第一個臨時的class as a<int>(30)

但我的錯誤是:

'(' 標記之前缺少模板 arguments

那么為什么會發生這種情況,這僅適用於 function 模板?

arguments 的模板參數推導僅適用於函數,不適用於 在您知道 class 的類型,即它的所有模板參數之前,您甚至不知道 class 有哪些成員函數!

所以,如果你想直接構造一個 object,你總是要說模板參數:

a<int> x(30);

這里有一個小思想實驗來擴展上述內容。 假設我們有

template <typename T> class Foo;

我們正在調用Foo::somefunction(x); ,其中x是某種類型。 你認為,好吧,我聲明somefunction()是這樣的:

template <typename T> class Foo
{
  static void somefunction(const T & x);
};

所以很明顯Tx的類型相同。 但現在想象一下我有一個專業:

template <> class Foo<char>
{
  static void anotherfunction(double x);
};

class Foo<char>甚至沒有function somefunction() ,所以表達式Foo::somefunction(x)甚至沒有達到我可以查找參數的階段!

解決這個問題的常用方法是創建一個免費的助手 function 來構建您的 object:

template <typename T> a<T> make_a(const T & x) { return a<T>(x); }

由於這是一個function模板,所以可以推導出它的參數:

make_a(30);      // type a<int>
make_a("hello"); // type a<char[6]>

構造函數不是模板,它的 class 是模板。 所以當你寫a(30)時,不能對 class 模板進行模板參數推導!

如果存在構造函數模板,則編譯器可以推導出模板化構造函數的模板參數。 例如這里:

template <typename T> class A{
public:
    template<typename U>
    A(const U &): {}   //note : it's a constructor template
};

A<char>  obj(30); //U is deduced as int

在上面的例子中,只能推導出U ,你仍然需要提供T 這是因為

  • U 是構造函數模板的模板參數。 在這種情況下可以進行模板參數推導。
  • T 是 class 模板的模板參數。 此處不能進行模板參數推導。

您仍然需要將臨時聲明為例如a<int>(30)

您不能將 class 模板 arguments 從 arguments 推斷到構造函數 - 不幸的是。

模板類型推導只發生在模板函數上。 您需要為模板 class 實例化指定參數。 您可以使用 function 模板來推導模板參數並返回適當的類型。 在 c++0 x 中,您可以使用 auto 來保存實例。 無法在我的手機上輕松為您編寫示例代碼!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM