2016-01-22 108 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

将其包含在内)是否需要在此处添加模板复杂性? –