Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
#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
#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
#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.
-
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.
#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
-
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:
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ě)
-
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