Błąd "stod was not declared in this scope" w C++11

0

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?

0

Co to jest stod?

0

Pokaż kod. I patrz czy masz using namespace std albo coś podobnego.

0

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

3
#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.

0

A jak go skonfigurować? Bo faktycznie mi przy tym kodzie znowu wywaliło taki błąd

0

Nie wiem, spytaj się google'a.

0

Oki. Dzięki. W każdym razie Jest już jakiś trop

0
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
1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1