«Ожидаемый инициализатор перед '<' токеном» в заголовочном файле - PullRequest
3 голосов
/ 07 мая 2010

Я довольно новичок в программировании, и меня обычно смущают заголовочные файлы и файлы включений. Я хотел бы помочь с немедленной проблемой компиляции и был бы признателен за общие советы о более чистых, безопасных и изящных способах написания моего кода.

В настоящее время я переупаковываю много кода, который был в main (), в класс Simulation. Я получаю ошибку компиляции с файлом заголовка для этого класса. Я компилирую с gcc версии 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

Я надеюсь, что другие файлы не имеют отношения к этой проблеме. Когда я компилирую с

g++ -g -o -c a.out -I /Applications/boost_1_42_0/ Host.cpp Simulation.cpp rng.cpp main.cpp Rdraws.cpp 

Я получаю

Simulation.h:33: error: expected initializer before '<' token
Simulation.h:102: error: 'HostContainer' does not name a type

, а затем куча других ошибок, связанных с не распознаванием HostContainer.

Похоже, у меня есть все необходимые Boost #include для понимания HostContainer. Что еще может пойти не так?

Буду признателен за немедленные предложения, советы по устранению неполадок и другие советы по поводу моего кода. Я планирую создать файл «HostContainer.h», который включает в себя typedef и структуры, которые определяют его теги, аналогично тому, что я делаю в «Event.h» для контейнера EventPQ. Я предполагаю, что это законная и хорошая форма.

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

Чтобы расширить мой комментарий, вот как вы можете разбить его, чтобы сделать его (а) читабельным, (б) обслуживаемым и (в) более легким для отладки. По сути, вы создаете typedef для каждого из типов индексов, а затем используете их в своем определении контейнера:

using namespace boost;
using namespace boost::multi_index;

typedef hashed_unique< 
            const_mem_fun<Host,int,&Host::getID> 
        > IDIndex;

typedef ordered_non_unique< 
            tag<age>,
            const_mem_fun<Host,int,&Host::getAgeInY> 
        > AgeIndex;

typedef hashed_non_unique< 
            tag<household>,
            const_mem_fun<Host,int,&Host::getHousehold> 
        > HouseholdIndex;

typedef ordered_non_unique<
            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>
            >
        > EligibilityByAgeAndHouseholdIndex;

typedef ordered_non_unique<
            tag<eh>,
            composite_key<
                Host,
                const_mem_fun<Host,bool,&Host::isEligible>,
                const_mem_fun<Host,int,&Host::getHousehold>
            >
        > EligibilityByHouseholdIndex;

typedef ordered_non_unique<
            tag<ah>,
            composite_key<
                Host,
                const_mem_fun<Host,int,&Host::getHousehold>,
                const_mem_fun<Host,int,&Host::getAgeInY>
            >
        > HouseholdAndAgeIndex;

typedef multi_index_container<
    boost::shared_ptr<Host>,
    indexed_by< 
        IDIndex,
        AgeIndex,
        HouseholdIndex,
        EligibilityByAgeAndHouseholdIndex,
        EligibilityByHouseholdIndex,
        HouseholdAndAgeIndex
    >
> HostContainer; 

Он самодокументируется, потому что имена индексов определены по типу, поэтому вам не нужны комментарии для описания назначения индексов. Поскольку определение контейнера довольно короткое, вы также можете опустить комментарии типа «end indexed_by».

Я не рекомендую использовать директиву using; Я просто положил его туда, чтобы он скомпилировался, не меняя ваш код слишком сильно.

3 голосов
/ 07 мая 2010

Кажется, что multi_index_container находится в пространстве имен boost.Поэтому вы должны ссылаться на него либо явно с boost::multi_index_container, либо использовать using декларации / директивы.

Ошибка HostContainer вызвана первой ошибкой.Обычно вы должны исправлять ошибки компиляции C ++ по порядку.

...