![](/img/trans.png)
[英]No matching constructor for initialization of variadic template in C++
[英]c++ template constructor initialization
template<class T>
class Node
{
public:
Node(Node<T>* next=NULL, T data=T()) : _next(next), _data(data)
{
}
Node<T>* _next;
T _data;
};
我是c ++模板的新手。 對於默認參數, T data = T()
是標准方法嗎? 也許T data = 0
也可以嗎?
這不是“構造函數初始化”,這是一個默認參數。 它允許調用者提供比函數少的參數,未指定的參數將采用默認值。
另一種方法是:
template<class T>
class Node
{
public:
Node(Node<T>* next, T data) : m_next(next), m_data(data) {}
Node(Node<T>* next) : m_next(next), m_data() {}
Node(void) : m_next(NULL), m_data() {}
Node<T>* m_next;
T m_data;
};
如果允許使用少於兩個參數,則調用不同的構造函數(具有幾乎相同的行為)。
使用單獨的重載有許多優點:
data
參數,則不需要copy-constructor。 data
參數,則不需要默認構造函數。 這與構造函數無關; 你所看到的是默認函數參數和值初始化的組合。
后者在C ++ 03標准§8.5/ 5中描述:
對值類型T的對象進行值初始化意味着:
- 如果T是具有用戶聲明的構造函數(12.1)的類類型(第9節),則調用T的默認構造函數(如果T沒有可訪問的默認構造函數,則初始化是錯誤的);
- 如果T是沒有用戶聲明的構造函數的非聯合類類型,那么T的每個非靜態數據成員和基類組件都是值初始化的;
- 如果T是數組類型,那么每個元素都是值初始化的;
- 否則,該對象被零初始化
和
零初始化T類型的對象意味着:
- 如果T是標量類型(3.9),則將對象設置為0(零)轉換為T的值;
- 如果T是非聯合類類型,則每個非靜態數據成員和每個基類子對象都是零初始化的;
- 如果T是聯合類型,則對象的第一個命名數據成員89)是零初始化的;
- 如果T是數組類型,則每個元素都是零初始化的;
- 如果T是引用類型,則不執行初始化。
最后,將它拼湊在一起,§8.5/ 7:
初始值為空集括號的對象,即(),應進行值初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.