Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: noname 08. 02. 2014, 18:31:56

Název: Nefunguje enum
Přispěvatel: noname 08. 02. 2014, 18:31:56
Zdravím všechny, mám dotaz. Vytvořil jsem si jednu větší třídu a v ní mám mimo jiné nějaké enumerace, které mám jak podle internetu, tak podle literatury deklarovány správně. Také tam mám členskou funkci, která ony enumerace využívá, problém jsem zjednodušil na následující kód. Pro překlad kódu využívám gcc/g++.

digit.hpp
Kód: [Vybrat]
#ifndef DIGITHPP
#define DIGITHPP

#include <QLabel>

class LDigit : public QLabel{

Q_OBJECT

public:

void function(LDigit::MinimumSize size);

enum MinimumSize {
Minimal = 1,
Medium = 2,
Maximal = 3
};



private:
};

#endif
digit.cpp
Kód: [Vybrat]
#ifndef LDIGITCPP
#define LDIGITCPP

#include <iostream>
#include "ldigit.hpp"
#include <QVBoxLayout>
#include <QHBoxLayout>

using namespace std;

void LDigit::function(LDigit::MinimumSize s){

cout << "Parameter of this function has value called ";

if (s==LDigit::Medium){
cout << "Medium" << endl;
}
else if (s==LDigit::Minimal){
cout << "Minimal" << endl;
}
else if (s==LDigit::Maximal){
cout << "Maximal" << endl;
}
}


#endif


main.cpp
Kód: [Vybrat]
#include <iostream>
#include <QApplication>
#include "ldigit.hpp"

using namespace std;

int main(int argc, char * argv[]){

LDigit::MinimumSize s =LDigit::Medium;

if (s==LDigit::Medium){
cout << "Medium" << endl;
}
else if (s==LDigit::Minimal){
cout << "Minimal" << endl;
}
else if (s==LDigit::Maximal){
cout << "Maximal" << endl;
}

return 0;
}

Přesto se při kompilaci objeví chyba, že MinimumSize není deklarováno:
In file included from ldigit.cpp:5:0:
ldigit.hpp:12:25: error: ‘LDigit::MinimumSize’ has not been declared
ldigit.cpp:11:6: error: prototype for ‘void LDigit::function(LDigit::MinimumSize)’ does not match any in class ‘LDigit’
ldigit.hpp:12:8: error: candidate is: void LDigit::function(int)
make: *** [ldigit.o] Error 1

Tušíte, kde je chyba?
Ona to bude nějaká hloupost, ale už nad tím vyšívám celé odpoledne.

Díky všem za odpovědi.
Název: Re:Nefunguje enum
Přispěvatel: noname 08. 02. 2014, 18:49:15
Tak vypadá, že jsem na to přišel.
Přesunul jsem definici enumerace před funkci a vše prozatím funguje. Snad tomu tak bude i v oné větší třídě. Kód vkládám níže.

Kód: [Vybrat]
#ifndef DIGITHPP
#define DIGITHPP

#include <QLabel>

class LDigit : public QLabel{

Q_OBJECT

public:

enum MinimumSize {
Minimal = 1,
Medium = 2,
Maximal = 3
};


void function(LDigit::MinimumSize size);

private:
};

#endif
Název: Re:Nefunguje enum
Přispěvatel: Sten 11. 02. 2014, 12:47:48
To je přesně ta chyba. V C++ (na rozdíl třeba od Javy) platí, že viditelné je pouze to, co bylo deklarované před daným příkazem. V C++11 jde výčet předběžně deklarovat, takže by stačilo:
Kód: [Vybrat]
enum MinimumSize;

void function(LDigit::MinimumSize size);

enum MinimumSize {

};

V C++03 to nejde a je potřeba ten výčet uvést před deklarací té funkce.

Jako ze všech pravidel, i tady existují výjimky:
Název: Re:Nefunguje enum
Přispěvatel: noname 11. 02. 2014, 22:37:57
Díky za perfektní a vyčerpávající odpověď.
Je skvělé vědět nejen jak, ale i proč to tak funguje.
+1