Pregunta

Estoy usando este ejemplo para inicializar el vector 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;
}

El único cambio que hice en este código es usar std::vector en lugar de vector y ahora tengo:

std::map<int, std::vector<bool> >  m_links;
std::vector<bool> m_allFalse {false, false, false, false, false};

Me dice que use ; después m_allFalse.¿Cómo puedo deshacerme de este error?

Estoy usando el compilador Intel 14, pero sin C++ 11.

¿Fue útil?

Solución

El problema es:

std::vector<bool> m_allFalse {false, false, false, false, false};

Sintaxis incorrecta en el estándar C ++.(Tal vez en C ++ 11, no lo sé)

Puede usar esta instancia:

std::vector<bool> m_allFalse(5, false); (*)

Si desea que C ++ 11 edite su etiqueta y siga la punta de @lakesh.

(*) Este constructor se explica en vector Documentación :

(2) El constructor de relleno construye un contenedor con n elementos.Cada Elemento es una copia de val.

Para inicializar los valores generales booleanos al principio, puede usar esta forma:

bool tempBool[] = { true, false, false, true };
std::vector<bool> variousBool ( tempBool, tempBool + sizeof(tempBool) / sizeof(bool) );

Sabiendo esto, podría crear su propia clase de vectores, simplemente heredar desde el vector (si desea que pueda usar la plantilla para extender a todos los tipos):

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);
    }
  }
}

Por lo tanto, de su principal, puede crear un PimpedVector de esta manera:

PimpedVector p0(5, true, false, false, true, false);

Otros consejos

La característica que estás usando se introdujo en C++11.Dado que, como revela la edición de su pregunta, está compilando como C++98, el compilador se queja con razón porque no es una sintaxis válida de C++98.

Para el caso especial de que todos los valores sean iguales, la forma C++98 (que todavía funciona en C++11, y para este caso especial también se prefiere allí) para inicializar es, como menciona Velthune,

std::vector<bool> m_allFalse(5, false);

En realidad desde std::vector por defecto inicializa todos sus valores, y false es el valor predeterminado de bool, para ese caso específico incluso puedes simplificarlo a

std::vector<bool> m_allFalse(5);

Si quieres valores más generales, tendrás que copiarlos, por ejemplo:

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

o

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

Una nota adicional:noto el m_ prefijo de su nombre de variable;esto sugiere que estás declarando un miembro variable (si es así, ese es un detalle crucial que omitiste).A una variable miembro no se le puede dar (en C++ 98) un inicializador (de ningún tipo) en su declaración (con la excepción de miembros constantes estáticos de tipo entero).Para las variables miembro no estáticas, debe inicializarlas en la llamada al constructor, por ejemplo:

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`
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top