Witam.
Staram się zainicjalizować unordered_map wewnątrz klasy.
Wygląda to tak:
std::unordered_map<int, void(*)(int)> Signals({
{2, Handler}, {4, Handler}, {8, Handler},
{11, Handler}, {15, Handler}, {22, Handler}
});
I wywala takie błędy:
SigHandler/SignalHandler.h:16:55: error: expected identifier before '{' token
std::unordered_map<int, void(*)(int)> Signals({
^
SigHandler/SignalHandler.h:16:55: error: expected ')' before '{' token
SigHandler/SignalHandler.h:19:10: error: expected unqualified-id before ')' token
});
^
SigHandler/SignalHandler.h: In member function 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)':
SigHandler/SignalHandler.h:17:17: warning: left operand of comma operator has no effect [-Wunused-value]
{2, Handler}, {4, Handler}, {8, Handler},
^~~~~~~
SigHandler/SignalHandler.h:17:17: error: no context to resolve type of '((SigHandler*)this)->SigHandler::Handler'
SigHandler/SignalHandler.h:17:25: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:27: error: expected primary-expression before '{' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:39: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:41: error: expected primary-expression before '{' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:53: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:18:13: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:26: error: expected primary-expression before ',' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:28: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:41: error: expected primary-expression before ',' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:43: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:19:9: warning: no return statement in function returning non-void [-Wreturn-type]
});
^
Dodatkowo, jak użyć iteratorów w tym przypadku? Takie użycie:
std::unordered_map<int, void(*)(int)>::iterator beg = Signals.begin();
std::unordered_map<int, void(*)(int)>::iterator end = Signals.end();
for(auto i = beg; beg!=end; ++beg){
std::signal(beg.first, SIG_DFL);
};
Wywala mi takie błędy:
SigHandler/SignalHandler.cpp: In destructor 'SigHandler::~SigHandler()':
SigHandler/SignalHandler.cpp:10:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
std::unordered_map<int, void(*)(int)>::iterator beg = Signals.begin();
^~~~~~~
SigHandler/SignalHandler.cpp:10:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
SigHandler/SignalHandler.cpp:11:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
std::unordered_map<int, void(*)(int)>::iterator end = Signals.end();
^~~~~~~
SigHandler/SignalHandler.cpp:11:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
SigHandler/SignalHandler.cpp:13:25: error: 'std::unordered_map<int, void (*)(int)>::iterator {aka struct std::__detail::_Node_iterator<std::pair<const int, void (*)(int)>, false, false>}' has no mem
ber named 'first' > ber named 'first' ber named 'first' > ber named 'first' ber named 'first' > ber named 'first' ber named 'first' > ber named 'first'
std::signal(beg.first, SIG_DFL);
^~~~~
Tutaj kod:
Definicja:
#ifndef SIGNAL_HANDLER_H
#define SIGNAL_HANDLER_H
#include <csignal>
#include <unordered_map>
class SigHandler{
public:
static SigHandler* GetInstance();
bool SetSigHandler(int, void(*func)(int));
~SigHandler();
private:
SigHandler();
SigHandler(const SigHandler&);
void Handler(int);
std::unordered_map<int, void(*)(int)> Signals({
{2, Handler}, {4, Handler}, {8, Handler},
{11, Handler}, {15, Handler}, {22, Handler}
});
};
namespace{
SigHandler* SHandler = SigHandler::GetInstance();
}
#endif
A tutaj deklaracja:
#include "SignalHandler.h"
SigHandler* SigHandler::GetInstance(){
static SigHandler* instance;
return instance;
}
SigHandler::~SigHandler(){
std::unordered_map<int, void(*)(int)>::iterator beg = Signals.begin();
std::unordered_map<int, void(*)(int)>::iterator end = Signals.end();
for(auto i = beg; beg!=end; ++beg){
std::signal(beg.first, SIG_DFL);
};
}
bool SigHandler::SetSigHandler(int sig, void(*func)(int)){
Signals[sig] = func; <<<<<<<<--- Tu mi też wywala błędy
}
void SigHandler::Handler(int sig){
Signals[sig](); <<<<<<<<--- Tu mi też wywala błędy
SetSigHandler(sig, Signals[sig]); <<<<<<<<--- Tu mi też wywala błędy
}
A tutaj cały poemat kompilatora:
In file included from SigHandler/SignalHandler.cpp:1:0:
SigHandler/SignalHandler.h:16:55: error: expected identifier before '{' token
std::unordered_map<int, void(*)(int)> Signals({
^
SigHandler/SignalHandler.h:16:55: error: expected ')' before '{' token
SigHandler/SignalHandler.h:19:10: error: expected unqualified-id before ')' token
});
^
SigHandler/SignalHandler.h: In member function 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)':
SigHandler/SignalHandler.h:17:17: warning: left operand of comma operator has no effect [-Wunused-value]
{2, Handler}, {4, Handler}, {8, Handler},
^~~~~~~
SigHandler/SignalHandler.h:17:17: error: no context to resolve type of '((SigHandler*)this)->SigHandler::Handler'
SigHandler/SignalHandler.h:17:25: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:27: error: expected primary-expression before '{' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:39: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:41: error: expected primary-expression before '{' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:17:53: error: expected primary-expression before ',' token
{2, Handler}, {4, Handler}, {8, Handler},
^
SigHandler/SignalHandler.h:18:13: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:26: error: expected primary-expression before ',' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:28: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:41: error: expected primary-expression before ',' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:18:43: error: expected primary-expression before '{' token
{11, Handler}, {15, Handler}, {22, Handler}
^
SigHandler/SignalHandler.h:19:9: warning: no return statement in function returning non-void [-Wreturn-type]
});
^
SigHandler/SignalHandler.cpp: In destructor 'SigHandler::~SigHandler()':
SigHandler/SignalHandler.cpp:10:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
std::unordered_map<int, void(*)(int)>::iterator beg = Signals.begin();
^~~~~~~
SigHandler/SignalHandler.cpp:10:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
SigHandler/SignalHandler.cpp:11:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
std::unordered_map<int, void(*)(int)>::iterator end = Signals.end();
^~~~~~~
SigHandler/SignalHandler.cpp:11:59: error: invalid use of member 'std::unordered_map<int, void (*)(int)> SigHandler::Signals(int)' (did you forget the '&' ?)
SigHandler/SignalHandler.cpp:13:25: error: 'std::unordered_map<int, void (*)(int)>::iterator {aka struct std::__detail::_Node_iterator<std::pair<const int, void (*)(int)>, false, false>}' has no member named 'first'
std::signal(beg.first, SIG_DFL);
^~~~~
SigHandler/SignalHandler.cpp: In member function 'bool SigHandler::SetSigHandler(int, void (*)(int))':
SigHandler/SignalHandl