kamil1338 Temat założony przez niniejszego użytkownika |
[C++] Zewnętrzna funkcja aktualizująca vector za pomocą algorytmu transform() » 2012-05-19 14:28:19 Witam, mam problem z skompilowaniem programu. Wszystko działa jak należy jeśli funkcja aktualizacja_populacji() znajduje się w tym samym pliku co int main(). Oto program: #include <iostream> #include <ctime> #include <algorithm> #include <iterator> #include <vector> #include <fstream> #include <functional> #include "aktualizuj_populacje.h" using namespace std;
class Town { string nazwa; int population; int altitude; enum { RAINY, SNOWY, CLOUDY, CLEAR } weather; public: Town & operator =( const Town & t ) { if( & t != this ) { nazwa = t.nazwa; population = t.population; altitude = t.altitude; weather = t.weather; } return * this; } void SetPopulation( int i ) { population = i; } int GetPopulation() const { return population; } Town( const Town & t ) : nazwa( t.nazwa ) , population( t.population ) , altitude( t.altitude ) , weather( t.weather ) { } Town( string n, int p, int a, int w ) : nazwa( n ) , population( p ) , altitude( a ) { if( !( w >= 0 && w <= 3 ) ) exit( 0 ); if( w == 0 ) weather = RAINY; if( w == 1 ) weather = SNOWY; if( w == 2 ) weather = CLOUDY; if( w == 3 ) weather = CLEAR; } friend ostream & operator <<( ostream & os, const Town & t ) { os << "Miejscowosc: " << t.nazwa << endl << "Liczba mieszkancow: " << t.population << endl << "Wyskokosc: " << t.altitude << " m.n.p.m" << endl; if( t.weather == RAINY ) os << "Pogoda: deszczowa" << endl; if( t.weather == SNOWY ) os << "Pogoda: snieg" << endl; if( t.weather == CLOUDY ) os << "Pogoda: zachmurzenie" << endl; if( t.weather == CLEAR ) os << "Pogoda: czyste niebo" << endl; os << "__________________________________" << endl; return os; } };
class Generator_Town { string alfabet; int przedzial_g1, przedzial_g2; string nazwa; int populacja; int wysokosc; int pogoda; public: Generator_Town() : alfabet( "abcdefghijklmnoprstuwyz" ) , przedzial_g1( 0 ) , przedzial_g2( 0 ) , nazwa( "" ) , populacja( 0 ) , wysokosc( 0 ) , pogoda( 0 ) { } Town operator ()() { while( true ) { przedzial_g1 = rand() % 23; przedzial_g2 = rand() % 23; next_permutation( alfabet.begin(), alfabet.end() ); if( przedzial_g1 < przedzial_g2 && przedzial_g2 > przedzial_g1 + 5 ) { nazwa = alfabet.substr( przedzial_g1, przedzial_g2 ); break; } } while( true ) { populacja = rand() % 1000000; if( populacja > 99 ) break; } wysokosc = rand() % 2501; pogoda = rand() % 4; return Town( nazwa, populacja, wysokosc, pogoda ); } };
int main() { ofstream out( "Towns.txt" ); srand( time( NULL ) ); vector < Town > v; generate_n( back_inserter( v ), 50, Generator_Town() ); transform( v.begin(), v.end(), ostream_iterator < Town >( out, "\n" ), aktualizuj_populacje() ); }
Oto biblioteka aktualizuj_populacje.h: #ifndef AKTUALIZUJ_POPULACJE_H #define AKTUALIZUJ_POPULACJE_H struct aktualizuj_populacje { Town operator ()( Town & t ) { t.SetPopulation( t.GetPopulation() * 110 / 100 ); return t; } }; #endif
Błędy: 8 D:\c++\tom2\roz_06\27\27.cpp In file included from D:\c++\tom2\roz_06\27\27.cpp 4 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h ISO C++ forbids declaration of `Town' with no type 4 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h expected `;' before "operator" 8 D:\c++\tom2\roz_06\27\aktualizuj_populacje.h expected `;' before '}' token C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h In function `_OutputIterator std::transform(_InputIterator, _InputIterator, _OutputIterator, _UnaryOperation) [with _InputIterator = __gnu_cxx::__normal_iterator<Town*, std::vector<Town, std::allocator<Town> > >, _OutputIterator = std::ostream_iterator<Town, char, std::char_traits<char> >, _UnaryOperation = aktualizuj_populacje]': 100 D:\c++\tom2\roz_06\27\27.cpp instantiated from here 789 C:\Dev-Cpp\include\c++\3.4.2\bits\stl_algo.h no match for call to `(aktualizuj_populacje) (Town&)'
Dodam jeszcze, że wstawianie ";" tam gdzie kompilator sobie życzy jest dla mnie bez sensu :). Proszę o pomoc. |
|
m4tx |
» 2012-05-19 14:31:18 operator () Z tego co wiem, to operator wstawia się w nazwie metody, a nie po spacji :P |
|
kamil1338 Temat założony przez niniejszego użytkownika |
» 2012-05-19 14:37:40 Niestety nie rozumiem, możesz mi w takim razie napisać gotowe rozwiązanie? Czy jest "metoda"? |
|
Admixior |
» 2012-05-19 22:35:18 Problem: kompilator w tym nagłówku nie wie co to jest "Town". Definicja tej klasy jest w main.cpp ale ona jest nieznana w aktualizuj_populacje.h. Kompilując ten plik kompilator nigdzie wcześniej nie widział
Rozwiązanie: Definicje klasy Town bez funkcji wrzuć do oddzielnego pliku np.: Town.h. Do wszystkich następnych plików gdzie używasz Town dorzucaj "#include "Town.h" (czyli do aktualizuj populacje.h i main.cpp) |
|
kamil1338 Temat założony przez niniejszego użytkownika |
» 2012-05-24 12:33:19 Nie było mnie jakiś czas. Dziękuję za odpowiedz. |
|
« 1 » |