[C++] <cstring> i własne namespace
Ostatnio zmodyfikowano 2010-07-27 14:05
programator Temat założony przez niniejszego użytkownika |
[C++] <cstring> i własne namespace » 2010-07-26 11:51:20 Witam, mam takie pliki: #include <iostream> #include "terminal_master.hpp" using namespace std; int main() { string temp( "432" ); cout << TM::str2int( temp ) << endl; }
#ifndef TERMINAL_MASTER_HPP #define TERMINAL_MASTER_HPP
using namespace std; #include <cstring> namespace TM { string int2str( int ); int str2int( string ); } #endif
#include "terminal_master.hpp"
#include <cstring>
using namespace std;
namespace TM { string int2str( int liczba ) { stringstream ss; ss << liczba; string tekst; ss >> tekst; return( tekst ); } int str2int( string tekst ) { stringstream ss; ss << tekst; int liczba; ss >> liczba; return( liczba ); } }
Wywala błędy: /home/pawel/Pulpit/terminal_master.hpp|8|error: ‘string’ does not name a type| /home/pawel/Pulpit/terminal_master.hpp|9|error: ‘string’ was not declared in this scope| /home/pawel/Pulpit/terminal_master.cpp|9|error: ‘string’ does not name a type| /home/pawel/Pulpit/terminal_master.cpp|17|error: redefinition of ‘int TM::str2int’| /home/pawel/Pulpit/terminal_master.hpp|9|error: ‘int TM::str2int’ previously defined here| /home/pawel/Pulpit/terminal_master.cpp|17|error: ‘string’ was not declared in this scope| ||=== Build finished: 6 errors, 0 warnings ===|
Czy ktoś wie jak mogę to naprawić? |
|
waxx |
» 2010-07-26 12:15:56 dodaj includy string i sstream |
|
programator Temat założony przez niniejszego użytkownika |
» 2010-07-26 15:34:37 Hmm, rzeczywiście w pliku terminal_master.cpp zapomniałem o sstream:) Ale nigdy bym nie pomyślał, że trzeba go też dołączyć do pliku hpp... Dzięki wielkie, a mógłbyś napisać, dlaczego plik nagłówkowy potrzebuje sstream?
|
|
malan |
» 2010-07-26 16:47:02 Plik nagłówkowy potrzebuje string tylko. Plik źródłowy potrzebuje sstream (string już nie, bo dodałeś go w pliku nagłówkowym) :). |
|
waxx |
» 2010-07-26 17:40:48 Dla porządku lepiej trzymać w nagłówkach wszystkie potrzebne includy. A w pliku implementacji klasy dołączać tylko headery klas/y. |
|
Elaine |
» 2010-07-26 18:59:54 Dla porządku lepiej trzymać w nagłówkach wszystkie potrzebne includy. A w pliku implementacji klasy dołączać tylko headery klas/y. |
Nieprawda. W nagłówku powinno się dołączać tylko i wyłącznie rzeczy wymagane przez nagłówek (a tych zwykle jest niewiele). Chyba, że chcesz sobie zafundować częste rekompilacje całego projektu (w C++ to wyjątkowo mocno boli, bo język jest tak skonstruowany, że kompilacja jest bardzo wolna), wtedy jak najbardziej możesz dołączać wszystko w nagłówku :P Poza tym, takie podejście ma jeszcze jedną "fajną" "zaletę" - po dołączeniu nagłówka napisanego w ten sposób dostajemy, poza deklaracjami i definicjami na których nam zależało, także milion innych rzeczy (por. namespace pollution) :> |
|
programator Temat założony przez niniejszego użytkownika |
» 2010-07-26 20:43:02 Hehe, nie pisał bym na forum, gdyby chodziło tylko o dodanie includa do pliku, który z niego korzysta:) Po prostu nie napisałem go tutaj w pierwszym poście:) Dla jasności: #include <iostream> #include "terminal_master.hpp" using namespace std; int main() { string temp( "1234" ); cout << TM::str2int( temp ) << endl; }
#ifndef TERMINAL_MASTER_HPP #define TERMINAL_MASTER_HPP
#include <cstring>
using namespace std;
namespace TM { string int2str( int ); int str2int( string ); } #endif
#include "terminal_master.hpp" #include <cstring> #include <sstream> using namespace std;
namespace TM { string int2str( int liczba ) { stringstream ss; ss << liczba; string tekst; ss >> tekst; return( tekst ); } int str2int( string tekst ) { stringstream ss; ss << tekst; int liczba; ss >> liczba; return( liczba ); } }
I wyrzuca błędy: /home/pawel/Pulpit/terminal_master.hpp|10|error: ‘string’ does not name a type| /home/pawel/Pulpit/terminal_master.hpp|11|error: ‘string’ was not declared in this scope| /home/pawel/Pulpit/terminal_master.cpp||In function ‘int TM::str2int(std::string)’:| /home/pawel/Pulpit/terminal_master.cpp|16|error: ‘int TM::str2int(std::string)’ redeclared as different kind of symbol| /home/pawel/Pulpit/terminal_master.hpp|11|error: previous declaration of ‘int TM::str2int’| ||=== Build finished: 4 errors, 0 warnings ===|
Jeżeli dodam do pliku hpp #include <sstream> kompiluje się i działa, tylko nie wiem dlaczego:) EDIT: Już chyba wiem:) klasa string potrzebuje do działania deklaracji zawartych w sstream... Równie dobrze mogę dołączyć <iostream>, <istream>, <ostream> lub <fstream>.... |
|
malan |
» 2010-07-26 21:11:43 << deleted by malan >> |
|
« 1 » 2 |