2010-05-07 6 views
3

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

Я в настоящее время переупаковываю много кода, который раньше был в 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 #includes для HostContainer, чтобы его понимали. Что еще может пойти не так?

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

+4

Вам следует серьезно подумать о разрыве typedef; typedef уменьшает его части, а затем наращивает их с помощью этих. –

+0

Не могли бы вы привести мне пример того, как вы можете разбить его? – Sarah

+0

Конечно; Я разместил его как ответ, так как он слишком длинный, чтобы опубликовать его как комментарий. –

ответ

3

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

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

+1

Gaaaaaaaaaaaaaaaahhhhhhh. Верно, спасибо. У меня возникают проблемы с элементами контейнера «indexed_by», «hashed_unique» и «const_mem_fun». Решение этих проблем находится на http://lists.boost.org/Archives/boost/2008/09/142085.php – Sarah

4

Чтобы развернуть мой комментарий, вы можете разбить его, чтобы сделать его (a) доступным для чтения, (b) ремонтопригодным и (c) легче отлаживать. В принципе, вы создаете для каждых определения типов типов индексов, а затем использовать их в своем определении контейнера:

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; 

Это самодокументированно, потому что имена индексных typedefed, так что вам не нужно комментарии, чтобы описать цель индексов. Поскольку определение контейнера довольно короткое, вы также можете опустить комментарии типа «end indexed_by».

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

+0

Большое спасибо, Джеймс. В этом есть смысл. Есть ли проблема с директивой «using», если я все это в файле заголовка строго для определения HostContainer? Делает вещи намного проще для чтения. – Sarah

+1

@Sarah: Вы не должны использовать директиву using, особенно в заголовке. Я просто кусаю пулю и рассказываю имена. –

 Смежные вопросы

  • Нет связанных вопросов^_^