“On attend de l'initialiseur avant '<' token” dans le fichier d'en-tête
Je suis assez nouveau dans la programmation et je suis généralement confus par les fichiers d'en-tête et comprend. Je voudrais de l'aide immédiatement compiler problème et il serait souhaitable que des suggestions d'ordre général sur plus propre, plus sûr, plus lisse façons d'écrire mon code.
Je suis en train de reconditionnement beaucoup de code qui sert à être dans le main() dans un Simulation
classe. J'ai une erreur de compilation avec le fichier d'en-tête pour cette classe. Je compile avec gcc version 4.2.1.
//Simulation.h
#ifndef SIMULATION_H
#define SIMULATION_H
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
#include <set>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/tuple/tuple_comparison.hpp>
#include <boost/tuple/tuple_io.hpp>
#include "Parameters.h"
#include "Host.h"
#include "rng.h"
#include "Event.h"
#include "Rdraws.h"
typedef multi_index_container< //line 33 - first error
boost::shared_ptr< Host >,
indexed_by<
hashed_unique< const_mem_fun<Host,int,&Host::getID> >, //0 - ID index
ordered_non_unique< tag<age>,const_mem_fun<Host,int,&Host::getAgeInY> >, //1 - Age index
hashed_non_unique< tag<household>,const_mem_fun<Host,int,&Host::getHousehold> >, //2 - Household index
ordered_non_unique< //3 - Eligible by age & household
tag<aeh>,
composite_key<
Host,
const_mem_fun<Host,int,&Host::getAgeInY>,
const_mem_fun<Host,bool,&Host::isEligible>,
const_mem_fun<Host,int,&Host::getHousehold>
>
>,
ordered_non_unique< //4 - Eligible by household (all single adults)
tag<eh>,
composite_key<
Host,
const_mem_fun<Host,bool,&Host::isEligible>,
const_mem_fun<Host,int,&Host::getHousehold>
>
>,
ordered_non_unique< //5 - Household & age
tag<ah>,
composite_key<
Host,
const_mem_fun<Host,int,&Host::getHousehold>,
const_mem_fun<Host,int,&Host::getAgeInY>
>
>
> //end indexed_by
> HostContainer;
typedef std::set<int> HHSet;
class Simulation
{
public:
Simulation( int sid );
~Simulation();
//MEMBER FUNCTION PROTOTYPES
void runDemSim( void );
void runEpidSim( void );
void ageHost( int id );
int calcPartnerAge( int a );
void executeEvent( Event & te );
void killHost( int id );
void pairHost( int id );
void partner2Hosts( int id1, int id2 );
void fledgeHost( int id );
void birthHost( int id );
void calcSI( void );
double beta_ij_h( int ai, int aj, int s );
double beta_ij_nh( int ai, int aj, int s );
private:
//SIMULATION OBJECTS
double t;
double outputStrobe;
int idCtr;
int hholdCtr;
int simID;
RNG rgen;
HostContainer allHosts; //shared_ptr to Hosts - line 102 - second error
HHSet allHouseholds;
int numInfecteds[ INIT_NUM_AGE_CATS ][ INIT_NUM_STYPES ];
EventPQ currentEvents;
//STREAM MANAGEMENT
void writeOutput();
void initOutput();
void closeOutput();
std::ofstream ageDistStream;
std::ofstream ageDistTStream;
std::ofstream hhDistStream;
std::ofstream hhDistTStream;
std::string ageDistFile;
std::string ageDistTFile;
std::string hhDistFile;
std::string hhDistTFile;
};
#endif
Je suis en espérant que les autres fichiers ne sont pas pertinents pour ce problème. Quand je compile avec
g++ -g -o -c a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp rng.cpp main.cpp Rdraws.cpp
- Je obtenir
Simulation.h:33: error: expected initializer before '<' token
Simulation.h:102: error: 'HostContainer' does not name a type
et puis un tas d'autres erreurs liées à la non-reconnaissance de la HostContainer.
Il semble que j'ai tous le droit de Stimuler #inclut pour la HostContainer à être compris. Quoi d'autre pourrait mal se passer?
J'apprécierais immédiate des suggestions, des conseils de dépannage, et d'autres conseils sur mon code. Mon plan est de créer une "HostContainer.h" fichier qui contient la définition de type et les structures qui définissent ses balises, semblable à ce que je suis en train de faire dans "l'Événement.h" pour le EventPQ conteneur. Je suppose que c'est légal et de la bonne forme.
Pourriez-vous me donner un exemple de la façon dont vous pourriez le casser?
Assurez-vous; je l'ai posté une réponse, car il est beaucoup trop long pour poster un commentaire.
OriginalL'auteur Sarah | 2010-05-07
Vous devez vous connecter pour publier un commentaire.
La
multi_index_container
semble être dans l'espace de nomsboost
. Donc, vous devez vous référer à elle soit explicitement avecboost::multi_index_container
, ou de l'utilisationusing
déclarations/directives.La
HostContainer
erreur est provoquée par la première erreur. Habituellement, vous devez vous adresser à la compilation C++ erreurs dans l'ordre.OriginalL'auteur mkj
Étendre sur mon commentaire, voici comment vous pouvez briser ce jusqu'à le rendre (un) lisibles, (b) maintenable, et (c) plus facile à déboguer. En gros, vous créez typedefs pour chacun des types d'index, puis utilisez les dans votre définition de conteneur:
C'est l'auto-documentation, car les noms d'index sont typedefed, de sorte que vous n'avez pas besoin de commentaires pour décrire le but des indices. Depuis la définition du conteneur est assez courte, vous pouvez omettre la "fin indexed_by" type de commentaires.
Je ne recommande pas l'utilisation de l'aide de la directive; je viens de le mettre là-bas et ce serait compiler sans me changer votre code de trop.
Vous ne devriez pas utiliser l'aide de la directive, et surtout pas dans l'en-tête. Je venais tout juste de mordre la balle et épeler les noms.
OriginalL'auteur James McNellis