Invalid use of void expression.

Invalid use of void expression.
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

Witam.
Od dłuższego czasu męczy mnie błąd "Invalid use of void expression". W całości wygląda tak:

Kopiuj
AccountSystem\AccountSystem.cpp: In function 'bool DeleteAccount(std::__cxx11::string&)':
AccountSystem\AccountSystem.cpp:42:12: error: invalid use of void expression
         }());

Kod wygląda tak:

Kopiuj
Część kodu z AccountSsytem\AccountSystem.cpp->DeleteAccount()
ErrHandler(0, "AccountSystem/DeleteAccount", "Cannot access datafile with accounts.", false, true, [&AccPath](){
            std::ofstream stream(AccPath.c_str());
            stream << HCipher::encode("temp") << ' ' <<HCipher::encode("temp");
            std::cout<<"Temporality account created. You can log in into them with login \"temp\" and password \"temp\"\nand then change login and password.";
            stream.close();
        }());

oraz deklaracja ErrHandler():

Kopiuj
template <typename ErrCode>
bool ErrHandler(ErrCode code,
                const char* function,
                const char* msg,
                bool IsFatal,
                bool OtherAction = false,
                void(*func)() = nullfunc)

Nie wiem w czym jest problem.

Z góry dziękuję za pomoc.

Pozdrawiam.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
edytowany 3x, ostatnio: flowCRANE
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
5

Nie możesz konwertować lambdy z nie-pustym capture list na function pointer.


do not code, write prose
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0
Kopiuj
ErrHandler(0, "AccountSystem/DeleteAccount", "Cannot access datafile with accounts.", false, true, [](){
            // std::ofstream stream(AccPath.c_str());
            // stream << HCipher::encode("temp") << ' ' <<HCipher::encode("temp");
            // std::cout<<"Temporality account created. You can log in into them with login \"temp\" and password \"temp\"\nand then change login and password.";
            // stream.close();
        }());

AccountSystem\AccountSystem.cpp: In function 'bool DeleteAccount(std::__cxx11::string&)':
AccountSystem\AccountSystem.cpp:42:12: error: invalid use of void expression
}());

Nie sądzę, żeby chodziło o to.


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
2

Ach tak, bo Ty tę lambdę od razu wywołujesz, co zwraca void, który próbujesz przekazać do funkcji ErrHandler. [](){ }() <-- ten ostatni nawias to wywołanie funkcji. Zauważ, że moja poprzednia odpowiedź wciąż jest aktualna.


do not code, write prose
PrezesiQ
  • Rejestracja:prawie 8 lat
  • Ostatnio:prawie 6 lat
  • Postów:187
0

Racja. Teraz działa, dziękuję. Jednakże w tej lambdzie muszę użyć zmiennej AccPath. Co mogę zrobić, żebym mógł jej użyć... ?


"Jesteśmy karłami, którzy wspięli się na ramiona olbrzymów. W ten sposób widzimy więcej i dalej niż oni, ale nie dlatego, ażeby wzrok nasz był bystrzejszy, lub wzrost słuszniejszy, ale dlatego, iż to oni nas dźwigają w górę i podnoszą o całą gigantyczną wysokość" ~ Bernard z Chartes
pingwindyktator
Rozumiem, że nie możesz zmienić deklaracji ErrHandler?
PrezesiQ
Móc - mogę. Chodzi Ci o to, żeby przesłać AccPath w argumencie, tak? Co w przypadku kiedy jedna funkcja potrzebowałaby np. inta, druga dwóch stringów itd?
PrezesiQ
Chodzi o te lambdy
pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
2

Jeśli możesz, to w deklaracji ErrHandler użyj std::function. To wszystko. Do std::function skonwertujesz zarówno function pointer, jak i lambde z dowolnym capture list.


do not code, write prose
PrezesiQ
Hmm.. Nie słyszałem o std::function. C++ odpowiednik function pointera z C? Ogarnę jak to działa. Dziękuję.
pingwindyktator
Z założenia std::function to obiekt, który reprezentuje cokolwiek, co jest callable. Zamiast void(*func)() użyj std::function<void()>.
PrezesiQ
Dziękuję bardzo. Działa. Ciekawe tylko jestem ile jest odpowiedników mechanizmów itd. z C które mają swoje lepsze odpowiedniki w C++. Dodatkowo mam pytanie. Co to znaczy "wszystko co jest callable". I czym jest to wszystko? Jeśli piszemy w rozumieniu Asm'a, czyli jak dobrze rozumiem skakanie pod jakiś adres to nie wiem do czego innego można to odnieść jak nie tylko do funkcji.
pingwindyktator
Nie do końca to miałem na myśli. Chodziło raczej o zwykłe funkcje, lambdy, struktury z operator (). Czyli cokolwiek, co możesz potraktować jako funkcje i "wywołać". Tutaj masz dokładne wyjaśnienie tego konceptu: https://en.cppreference.com/w/cpp/named_req/Callable
PrezesiQ
Dziękuję bardzo.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.