2016-01-22 90 views
1

我目前的任務是爲我的教授提供給我們的特殊定製課程創建定義;我從來沒有見過使用initializer_list,我的教授也沒有看過。它究竟做了什麼?initializer_list做什麼?

template<class T> 
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il) { 

} 

我必須定義構造函數,我將自己做。我只是想知道這個參數是做什麼的。此外,我的編譯器不斷告訴我,未找到std :: initializer_list成員聲明。我使用#include導入它,但問題仍然存在。

+3

你試過Google嗎? – erip

+0

另外,不要忘記編譯_at least_ C++ 11支持。 '-std = C++ 11'或'-std = C++ 14'。 – erip

+0

我做過了,但對我的問題有獨特的答案仍然有幫助。 –

回答

2

它允許你用{}初始化LinkedQueue。 在

LinkedQueue<char> theQueue = {'a','b','c','d','e','f','g','h' }; 

以及其他的事情,詳細here一個關於它和它的用途頁面上。

+0

謝謝分享!另外,你知道爲什麼我在我的參數中有一個錯誤,說我輸入它時「initializer_list成員沒有聲明」? –

+0

@Xari你可能沒有用C++ 11編譯。 – erip

+0

嗨,我在我的C++設置/ GCC C++編譯器/雜項標誌 - > -c -fmessage-length = 0 -std = gnu ++ 11 -std = C++ 11 –

1

在C++ 11中,初始化列表是一種將內容分配給對象的方法,當需要幾個文字時。

例如,你可以像初始化列表:

std::list<int> myList{1,2,3,4,5}; 

你可以寫你的類,所以接受這樣的語法。

作爲極簡例如,下面的函數接受初始化列表:

void func(initializer_list<int> intList) 
{ 
    for (auto i: intList) /*whatever*/; 
} 

// used as: 
func({1,2,3,5}); 

初始化必須是同一類型的:在初始化列表不能從不同類型的混合值。

2

std::initializer_list是一個類模板,它包含一個初始化器序列,它有一個非常小的接口,因爲它的唯一目的是用來用包含它的值序列初始化另一個對象。與std::vectorstd::deque不同,std::initializer_list不適用作通用容器。

函數LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>&)被稱爲當有人試圖列出初始化一個LinkedQueue<T>,像這樣:

LinkedQueue<int> q {1, 2, 3}; 

語言自動構造一個std::initializer_list<int>對象,其包含值1,2,3,按該順序。這個對象被傳遞給構造函數。在構造函數返回後,用戶期望新構造的LinkedQueue<int>對象將按照該順序包含值1,2,3。

您需要編寫構造函數,使其成爲true。爲此,可以使用基於範圍的for循環遍歷std::initializer_list<T>對象,並將值添加到列表中。像這樣的東西可能會奏效,假設你有一個push_back功能和工作的默認構造函數:

template<class T> 
LinkedQueue<T>::LinkedQueue(const std::initializer_list<T>& il): LinkedQueue() { 
    for (const T& val : il) { 
     push_back(val); 
    } 
} 

這代表到默認的構造函數來設置類不變量,然後插入指定的初始化秩序。

+0

將其包含在內)是否需要在此處添加模板複雜性? –