C++ 11 jaki program i kompilator?

Siema chciałbym sobie przeanalizować ten kod i skompilować go.

http://www.penguinprogrammer.co.uk/rpg-tutorial-2/

Problem w tym że mój Code Blocks wykrywa błędy nawet jak w opcjach zaznaczę kompilowanie C++ 11…

A Visual Studio ma w ogóle jakieś inne biblioteki i nie działa w nim nawet “cout”…

Macie jakieś pomysły? :slight_smile:

 

Visual Studio śmiga aż miło. Najpierw sprawdzałem na 2010, na której normalnie piszę, aczkolwiek ona nie wspiera c++11, więc oczywiście nie poszło. VS2013 Ultimate skompilowało bez problemu (pomijając kilka warningów).

To dlaczego mam taki kod przykładowy?

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

I nie działa “cout”, ani “cin”?

Śmiga jeśli utworzysz projekt bez prekompilowanych nagłówków.

 

A cout/cin śmiga ślicznie o ile użyjesz odpowiedniej biblioteki:

#include <iostream>

using namespace std;
int main()
{
    cout<<"dziala";
    return 0;
}

Gdy tworzysz projekt pojawia się form :arrow: klikasz dalej, po czym zaznaczasz “empty project”

 

/home/tomek$ mkdir rpg

/home/tomek$ cd rpg

/home/tomek/rpg$ fetch http://penguinprogrammer.nfshost.com/data/rpg-tutorial.zip

rpg-tutorial.zip                              100% of   19 kB   99 kBps 00m00s

/home/tomek/rpg$ unzip rpg-tutorial.zip

Archive:  rpg-tutorial.zip

 extracting: area.hpp

 extracting: armour.hpp

 extracting: atlas.cpp

 extracting: atlas.hpp

 extracting: battle.hpp

 extracting: creature.hpp

 extracting: dialogue.hpp

 extracting: inventory.hpp

 extracting: item.hpp

 extracting: main.cpp

 extracting: weapon.hpp

/home/tomek/rpg$ ls

area.hpp                atlas.cpp               battle.hpp              dialogue.hpp            item.hpp                rpg-tutorial.zip

armour.hpp              atlas.hpp               creature.hpp            inventory.hpp           main.cpp                weapon.hpp

/home/tomek/rpg$ clang++ -o swinka -std=c++11 *.cpp

/home/tomek/rpg$ ll swinka

-rwxr-xr-x  1 tomek  wheel  168655  2 kwi 21:21 swinka*

/home/tomek/rpg$ uname -srm

FreeBSD 10.1-STABLE amd64

 

Tak sobie zerkam na ten kod:

    // Remove the specified number of items from the inventory

    void remove_item(Item* item, int count)

    {

        // Iterate through the items, and if they are found then decrease

        // the quantity by the quantity removed

        for(auto& it : this->items)

        {

            if(it.first == item) it.second -= count;

        }

        // Iterate through the list again, and remove any elements from

        // the list that have zero or less for their quantity

        // We do this in two passes because removing an element from

        // a list during a for loop invalidates the iterators, and the

        // loop stops working

        this->items.remove_if([](std::pair<Item*, int>& element)

        {

            return element.second < 1;

        });

    }

Jeśli autor myśli że algorytm remove_if mu coś usunie to jest w błędzie. Remove_if służy do zgrupowania

elementów spełniających predykat na końcu kontenera, ale jeśli chcemy je fizycznie usunąć to należy jeszcze

użyć erase z iteratorem który zwróci właśnie remove_if.

 

Podobny błąd (błąd o ile rzeczywiście autor chce coś usuwać) jest w innych funkcjach.

 

Szkoda że autor wyłączył komentarze na swojej stronie.