我正在使用此示例来初始化bool向量:
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main() {
map<int, vector<bool> > myMap;
vector<bool> one {true, true, false};
myMap[2] = one;
cout << myMap[2][0] << endl;
cout << myMap[2][1] << endl;
cout << myMap[2][2] << endl;
return 0;
}
我在此代码中所做的唯一更改是使用std::vector
而不是vector而我现在拥有:
std::map<int, std::vector<bool> > m_links;
std::vector<bool> m_allFalse {false, false, false, false, false};
它告诉我在;
之后使用m_allFalse
。我怎样才能摆脱这个错误?
我使用的是intel编译器14,但没有使用c ++ 11。
答案 0 :(得分:13)
问题是:
std::vector<bool> m_allFalse {false, false, false, false, false};
标准C ++中的语法错误。 (也许在C ++ 11中,我不知道)
您可以使用此实例:
std::vector<bool> m_allFalse(5, false); (*)
如果您希望C ++ 11编辑您的标记并按照@lakesh提示。
(*)此构造函数在向量documentation中解释:
(2)fill构造函数构造一个包含n个元素的容器。每 element是val的副本。
要在开头初始化常规布尔值,可以使用以下方式:
bool tempBool[] = { true, false, false, true };
std::vector<bool> variousBool ( tempBool, tempBool + sizeof(tempBool) / sizeof(bool) );
知道这一点,你可以创建自己的矢量类,只需从vector继承(如果你想要你可以使用模板扩展到所有类型):
class PimpedVector : public std::vector<bool> {
public:
PimpedVector(const unsigned int& size, ...) {
va_list args;
va_start(args, size);
for ( size_t i = 0; i < size; ++i ) {
bool b = va_arg(args, bool);
this->push_back(b);
}
}
}
因此,您可以通过这种方式创建一个PimpedVector:
PimpedVector p0(5, true, false, false, true, false);
答案 1 :(得分:3)
您正在使用的功能是在C ++ 11中引入的。因为,正如您的问题编辑所揭示的那样,您正在编译为C ++ 98,编译器正确地抱怨它,因为它不是有效的C ++ 98语法。
对于所有值相同的特殊情况,如Velthune所述,C ++ 98方式(仍然在C ++ 11中工作,并且对于这种特殊情况也适用于那里)进行初始化
std::vector<bool> m_allFalse(5, false);
实际上,由于std::vector
默认初始化其所有值,而false
是默认值bool
,因此对于特定情况,您甚至可以将其简化为
std::vector<bool> m_allFalse(5);
如果您想要更多通用值,则必须将其复制到其中,例如:
std::vector<bool> foo(3);
foo[0] = foo[1] = true;
foo[2] = false; // that line is actually not needed because of default initialization of members
或
std::vector<bool> foo;
foo.push_back(true);
foo.push_back(true);
foo.push_back(false); // this time, it is needed because it actually created the thirs argument
附加说明:我注意到您的变量名称的m_
前缀;这表明您正在声明成员变量(如果是这样,那就是您遗漏的关键细节)。成员变量不能(在C ++ 98中)在其声明中给出初始化器(任何类型)(除了整数类型的静态const成员)。对于非静态成员变量,您必须在构造函数调用时初始化它们,例如:
class X
{
public:
X(); // the constructor
private:
std::vector<bool> m_Foo;
};
// constructor definition follows
X::X():
m_Foo(5, false) // this initializes your member variable `m_Foo`
{
}