Witam.
Mam problem z funkcją stod która jest w standardzie C++11.
W ustawieniach kompilatora mam zaznaczoną opcję "Have g++ follow the C++11 ISO C++ language standard [-std=c++11]",
i kompilator GNU GCC Compiler z MinGw.
Mimo tego, wyskakuje mi błąd 'stod' was not declared in this scope.
Co mogę zrobić z tym, żeby stod działało?
Co to jest stod?
Pokaż kod. I patrz czy masz using namespace std
albo coś podobnego.
kod pisany u korepetytora, ale nie testowany.
#ifndef PLIKI_CPP
#define PLIKI_CPP
#include <iostream>///do testowania
#include <fstream>
#include "gotoXY.cpp"
#include <list>
#include "Pracownik.cpp"
#include "czysc_ekran.cpp"
#include <string>
using namespace std;
string nazwa_pliku;
string podaj_nazwe_pliku(int x,int y)
{
string nazwa;
gotoXY(x,y);cout<<"Podaj nazwe pliku: ";
cin>>nazwa;
return nazwa+".txt";
}
int dopisz_z_pliku(string nazwa_pliku, list<Pracownik*>&lista) /// dopisuje do istniejacej listy pozycje z pliku
{
ifstream plik (nazwa_pliku.c_str());
if (plik.is_open())
{
int nr_linii = 0;
string linia;
int opcja;
string imie, nazwisko, stanowisko;
double wynagrodzenie;
while ( getline (plik,linia) )
{
opcja = nr_linii%5;
switch(opcja)
{
case 0:
if(linia[0] == '#')
{
if(nr_linii)
lista.push_back(new Pracownik(imie, nazwisko, stanowisko, wynagrodzenie));
if(linia[1] == '#')
return 0;
}
else
{
if(nr_linii>=10)
return nr_linii/5 -1;
else
return -1;
}
break;
case 1:
imie = linia;
break;
case 2:
nazwisko = linia;
break;
case 3:
stanowisko = linia;
break;
case 4:
stod(linia, &wynagrodzenie);
break;
}
}
}
else return -1;
}
int otworz_plik(string nazwa_pliku, list<Pracownik*>&lista) ///czysci liste i uzupelnia ja pozycjami z pliku
{
lista.clear();
return dopisz_z_pliku(nazwa_pliku, lista);
}
void importujListeZPliku(list<Pracownik*>&lista,int x,int y)
{
int wybor;
nazwa_pliku=podaj_nazwe_pliku(x,y);
czysc_ekran(x,y);
gotoXY(x,y);cout<<"1)Importuj do czystej listy";
gotoXY(x,y+1);cout<<"2)Importuj do istniejacej listy";
do
{
cin.clear();cin.sync();
gotoXY(x,y+2);cin>>wybor;
}
while(cin.fail());
switch(wybor)
{
case 1:
//otworz_plik(nazwa_pliku,lista);
break;
case 2:
//dopisz_z_pliku(nazwa_pliku,lista);
}
}
int zapisz_do_pliku(string nazwa_pliku, list<Pracownik*>&lista) ///zapisuje pozycje z listy do pliku
{
ofstream plik (nazwa_pliku.c_str());
if (plik.is_open())
{
list<Pracownik*>::iterator it = lista.begin();
while(it!=lista.end())
{
plik<<"#"<<endl;
plik<<(*it)->getImie()<<endl;
plik<<(*it)->getNazwisko()<<endl;
plik<<(*it)->getStanowisko()<<endl;
plik<<(*it)->getWynagrodzenie()<<endl;
it++;
}
plik<<"##"<<endl;
plik.close();
return 0;
}
else return -1;
}
#endif // PLIKI_CPP
#ifndef PLIKI_CPP
#define PLIKI_CPP
#include "gotoXY.cpp"
Jeżeli korepetytor pozwala Ci takie rzeczy pisać i nie zwraca uwagi na tragiczny wygląd kodu, to dobrze Ci radzę, zmień go.
A co do błędu, spróbuj to skompilować:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "7.0452";
double x = stod(s);
cout << x << endl;
}
Jak wywala błąd to znaczy, że masz źle skonfigurowany kompilator.
A jak go skonfigurować? Bo faktycznie mi przy tym kodzie znowu wywaliło taki błąd
Nie wiem, spytaj się google'a.
Oki. Dzięki. W każdym razie Jest już jakiś trop
adrian.lodz napisał(a):
A jak go skonfigurować? Bo faktycznie mi przy tym kodzie znowu wywaliło taki błąd
Systemy unixopodobne:
g++ nazwaPlikuCpp.cpp
./a.out
Sądzę że chodzi o tą wersje stod
której używasz:
zamiast: stod(linia, &wynagrodzenie);
ma być: wynagrodzenie=stod(linia,nullptr);
Radzę też przerobić odczyt zapis:
ostream &tab(ostream &s) { return s<<'\t'; }
bool zapisz_do_pliku(string nazwa_pliku, list<Pracownik*>&lista) ///zapisuje pozycje z listy do pliku
{
ofstream plik(nazwa_pliku.c_str());
if(!plik) return false;
for(list<Pracownik*>::iterator it=lista.begin();it!=lista.end();++it)
{
plik<<"#"<<tab;
plik<<(*it)->getImie()<<tab;
plik<<(*it)->getNazwisko()<<tab;
plik<<(*it)->getStanowisko()<<tab;
plik<<(*it)->getWynagrodzenie()<<endl;
}
//plik.close(); // sam się zamknie
return true;
}
bool dopisz_z_pliku(string nazwa_pliku, list<Pracownik*>&lista) /// dopisuje do istniejacej listy pozycje z pliku
{
ifstream plik (nazwa_pliku.c_str());
if(!plik) return false;
for(string line;getline (plik,linia);)
{
istringstream sin(linia);
string imie,nazwisko,stanowisko;
double wynagrodzenie;
getline(sin,imie,'\t');
getline(sin,nazwisko,'\t');
getline(sin,stanowisko,'\t');
sin>>wynagrodzenie;
}
return true;
}
Oprócz tego nie widzę powodu (oprócz utrudnienia sobie życia) dla którego trzymasz w liście wskaźniki zamiast obiektu.