[英]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);
};
所以很明顯T
與x
的類型相同。 但現在想象一下我有一個專業:
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
。 這是因為
您仍然需要將臨時聲明為例如a<int>(30)
。
您不能將 class 模板 arguments 從 arguments 推斷到構造函數 - 不幸的是。
模板類型推導只發生在模板函數上。 您需要為模板 class 實例化指定參數。 您可以使用 function 模板來推導模板參數並返回適當的類型。 在 c++0 x 中,您可以使用 auto 來保存實例。 無法在我的手機上輕松為您編寫示例代碼!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.