Błąd podczas inicjalizowania unordered_map.

0

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
0

Nie wiem czy pomoże, próbowałeś inicjować tę mapę w konstruktorze?

2

wywal nawiasy okrągłe!
Stara metoda inicjalizacji (Direct initialization) nie działa w tym miejscu (in-class member initialization).

A swoją drogą, dla skomplikowanych typów, wole jednak inicjalizację poza nagłówkiem - czyli w konstruktorze definiowanym na zewnątrz kasy w cpp (mniejsza ilość zależności w nagłówku).

0

Zlituj się nad później to czytającym (w tym nad sobą)...

typedef void (*HandlerFunc)(int);

std::unordered_map<int, HandlerFunc> Signals = { ... };


bool SigHandler::SetSigHandler(int sig, HandlerFunc func)
0

Hmm,

Kolego, chcesz na stacku inicjalizowac objekt w definicji klasy? Ale to se ne da w C++!

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