web-dev-qa-db-fra.com

Erreur de temps de compilation C ++: identifiant attendu avant la constante numérique

J'ai lu d'autres articles similaires mais je ne comprends tout simplement pas ce que j'ai fait de mal. Je pense que ma déclaration des vecteurs est correcte. J'ai même essayé de déclarer sans taille mais même cela ne fonctionne pas. Mon code est:

#include <vector> 
#include <string>
#include <sstream>
#include <fstream>
#include <cmath>

using namespace std;

vector<string> v2(5, "null");
vector< vector<string> > v2d2(20,v2);

class Attribute //attribute and entropy calculation
{
    vector<string> name(5); //error in these 2 lines
    vector<int> val(5,0);
    public:
    Attribute(){}

int total,T,F;

};  

int main()
{  
Attribute attributes;
return 0;
}
35
user1484717

Tu ne peux pas faire ça:

vector<string> name(5); //error in these 2 lines
vector<int> val(5,0);

dans une classe en dehors d'une méthode.

Vous pouvez initialiser les membres de données au point de déclaration, mais pas avec () supports:

class Foo {
    vector<string> name = vector<string>(5);
    vector<int> val{vector<int>(5,0)};
};

Avant C++ 11, vous devez d'abord les déclarer, puis les initialiser par exemple dans un constructeur

class Foo {
    vector<string> name;
    vector<int> val;
 public:
  Foo() : name(5), val(5,0) {}
};
60
juanchopanza

Initialisations avec (...) dans le corps de classe n'est pas autorisé. Utilisation {..} ou = .... Malheureusement, puisque le constructeur respectif est explicit et vector a un constructeur de liste d'initialisation, vous avez besoin d'un cast fonctionnel pour appeler le constructeur voulu

vector<string> name = decltype(name)(5);
vector<int> val = decltype(val)(5,0);

Comme alternative, vous pouvez utiliser des listes d'initialisation de constructeur

 Attribute():name(5), val(5, 0) {}
7

Étant donné que votre compilateur ne prend probablement pas encore en charge la totalité de C++ 11, qui prend en charge une syntaxe similaire, vous obtenez ces erreurs car vous devez initialiser vos membres de classe dans les constructeurs:

Attribute() : name(5),val(5,0) {}
2
slartibartfast