Domanda

Sto usando questo esempio per inizializzare il vettore 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;
}
.

L'unico cambiamento che ho realizzato in questo codice utilizza std::vector anziché vettoriale e ora ho:

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

Mi dice di utilizzare ; dopo m_allFalse.Come posso sbarazzarmi di questo errore?

Sto usando Intel Compiler 14, ma senza C ++ 11.

È stato utile?

Soluzione

Problema è:

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

Sintassi errata in standard C ++.(forse in C ++ 11, non lo so)

È possibile utilizzare questa istanza:

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

Se vuoi c ++ 11 modifica il tag e segui la punta @lakesh.

(*) Questo costruttore è spiegato in Vector Documentazione :

.

(2) Il costruttore di riempimento costruisce un contenitore con N elementi.Ogni L'elemento è una copia della Val.

Per inizializzare i valori dei booleani generali all'inizio, è possibile utilizzare questo modo:

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

Sapendo questo, potresti creare la tua classe vettoriale, semplicemente ereditando dal vettore (se vuoi che tu possa usare il modello per estendere a tutti i tipi):

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

Quindi dal tuo principale puoi creare un pimpedvector in questo modo:

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

Altri suggerimenti

La funzione che stai utilizzando è stata introdotta in C ++ 11. Dal momento che, come rivela la tua domanda, stai compilando come C ++ 98, il compilatore si lamenta giustamente a riguardo, perché non è valido C ++ 98 Sintassi.

Per il caso speciale di tutti i valori è lo stesso, il modo C ++ 98 (che lavora ancora in C ++ 11, e per questo caso speciale preferito anche lì) per inizializzare è, come menzionato da Velthune, .

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

In realtà poiché std::vector predefinito-Inizializza tutti i suoi valori e false è il valore predefinito di bool, per quel caso specifico che puoi persino semplificarlo a

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

Se si desidera più valori generali, dovrai copiarli, ad esempio:

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 aggiuntiva: noto il prefisso m_ del tuo nome della variabile; Ciò suggerisce che stai dichiarando una variabile (se sì, è un dettaglio cruciale che hai lasciato fuori). Una variabile membro non può (in c ++ 98) viene data un inizializzatore (di qualsiasi tipo) alla sua dichiarazione (ad eccezione dei membri const statici del tipo intero). Per le variabili dei membri non statiche, è necessario inizializzarli nella chiamata del costruttore, ad esempio:

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`
{
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top