Nefunguje enum

noname

Nefunguje enum
« kdy: 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.


noname

Re:Nefunguje enum
« Odpověď #1 kdy: 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

Sten

Re:Nefunguje enum
« Odpověď #2 kdy: 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:
  • ve vnořených rozsazích (mezi { a }) uvnitř tříd lze odkazovat na členy nadřazených tříd, i když ty jsou deklarovány až později
  • u šablon se tohle pravidlo u referencí závislých na parametrech té šablony aplikuje až při instancování (deklarace se kontrolují pouze formálně)

noname

Re:Nefunguje enum
« Odpověď #3 kdy: 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