błąd przy tworzeniu iteratora klasy vector / case i klamry

0

piszę kod, w którym chcę klasę wepchnąć do wektora. Klasa ta wygląda tak:

class Pawn: public Figure
{
public:
	Pawn();
    Pawn(int x, int y, Color c);
    bool canMove(int x, int y);
};

w kodzie napisałem coś takiego

vector<Pawn>::iterator iter1;
        vector<Pawn>::iterator iter2;

no i w tych linijkach mam błąd:

crosses initialization of ‘__gnu_cxx::__normal_iterator<Pawn*, std::vector<Pawn, std::allocator<Pawn> > > iter1’

jak to ugryźć? Wcześniej nie maiłem takich problemów.

0

podaj reszte bledu, poniewaz wkleiles tylko kawalek. "crosses initialization" jest polowa zdania.
generalnie, pewnie probujesz stworzyc te zmienne w SWITCH/CASE, ktory to case nie ma klamer {} oznaczajacych nowy scope - w takim przypadku kompilator sie pluje, ze scope zmiennych wyszedlby poza blok case i bylyby one widoczne w innym case, w ktorym nie mogłyby i nie miałyby prawa miec poprawnych wartosci, poniewaz ow inny case przeskakuje ich inicjalizację ("jump to case label"/"crosses initialization") ==> w tym innym bloku case bylyby po prostu bledne i niebezpieczne. stad blad kompilacji.

0

to jest ten błąd:
http://img695.imageshack.us/img695/9284/przechwytywanieio.png
a linijka wygląda tak:

void Board::move(int x1, int y1, int x2, int y2)
{
    char **b = getBoard();

    switch(b[x1][y1])
    {
    case 'P':
    case 'p':
        vector<Pawn>::iterator iter1;
        vector<Pawn>::iterator iter2;
0
switch(b[x1][y1])
{
case 'P':
case 'p':
    { //<---
        vector<Pawn>::iterator iter1;
        vector<Pawn>::iterator iter2;

        (...)
    } //<---

    (...)
0
no_solution_found napisał(a)

to jest ten błąd:
http://img695.imageshack.us/img695/9284/przechwytywanieio.png
a linijka wygląda tak:

void Board::move(int x1, int y1, int x2, int y2)
{
    char **b = getBoard();

    switch(b[x1][y1])
    {
    case 'P':
    case 'p':
        vector<Pawn>::iterator iter1;
        vector<Pawn>::iterator iter2;

Tak naprawdę problem masz poniżej (uzupełniając przez zmyślenie):

void Board::move(int x1, int y1, int x2, int y2)
{
    char **b = getBoard();

    switch(b[x1][y1])
    {
    case 'P':
    case 'p':
        vector<Pawn>::iterator iter1;
        vector<Pawn>::iterator iter2;
        ....

    case 'z':
    case 'Z':
        // i tu masz problem! bo przeskakujesz inicjalizację iter1 oraz iter2
        // a zmienne te są tu dla ciebie widoczne. To jest groźne więc kompilator krzyczy, że powinieneś się
        // na coś zdecydować


Są dwa wyjścia:

  1. dodać klamry jak ktoś pokazał powyżej.
  2. przenieść deklarację zmiennych przed switch.
0

no wiem, ja z tych zmiennych chciałem korzystać tylko tam gdzie je napisałem (w innych case'ach ma tego nie widzieć). Klamry rozwiązały mój problem, choć myślałem, że one nie będą potrzebne ;p

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