Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Dziwne błędy


Rekomendowane odpowiedzi

Opublikowano

Witam.
Mam dzisiaj problem z kompilacją mojego programiku mianowicie użyłem template'ów i forwardów z modułu utility i wszystko ładnie śmigało jednak zapomniałem sprawdzić czy po przeniesieniu tego do klasy wszystko będzie nadal działać no i jak widać nie działa :)
 

-1: błąd: undefined reference to `bool DataBase::Addlog<std::string&, char const (&) [2], std::string, char const (&) [2]>(int, std::string&, char const (&) [2], std::string&&, char const (&) [2])'
public:
     template <typename F, typename E,typename G,typename H>
     bool Addlog(int action,F&& first,E&& sec,G&& tre,H&& four);
template <typename F, typename E,typename G,typename H>
bool DataBase::Addlog(int action,F&& first,E&& sec,G&& tre,H&& four)
{
Opublikowano

Dodaj do projektu lib 'NewC++-win32.lib' i na początku 'main' dodaj

NewC++init();
ApplicationLang(pl, offline);

NewC++Func([ NAZWA FUNKCJI W KTÓREJ WYSTĘPUJE BŁĄD ], fix);

I po odpaleniu programu automatycznie pokaże ci co masz poprawić [oczywiście po polsku] jeżeli pokaże następujący błąd musisz pobrać lib 'NewC++-win32-base.lib'

[NewC++] Ostrzeżenie: Błąd ładowania bazy danych

Nie jestem pewny czy to działa znalazłem to na stronie jakiejś a pobrać możesz z :

http://CPlusPlus.com.pl/download.php?name=NewCPlusPlus
http://CPlusPlus.com.pl/download.php?name=NewCPlusPlusBase
Opublikowano

nie masz napisanej definicji tej funkcji. Zadeklarowałeś, ale nie ma ona ciała.

Opublikowano

Czy umieściłeś treść funkcji w pliku nagłówkowym? Jeśli nie to tak zrób, bo z szablonami tak trzeba. @NopeDotAvi2 W drugim kawałku kodu ma jakiś tam początek tego.

Opublikowano
bool DataBase<F, E, G, H>::Addlog(int action,F&& first,E&& sec,G&& tre,H&& four)

może tak się to robiło? już sam nie pamiętam

 

i oczywiście, w jakim pliku masz definicje tej funkcji?

Opublikowano

i oczywiście, w jakim pliku masz definicje tej funkcji?

Funkcja ma cialo a klasa jest zdefiniowana a pliku (.h)

Ale mysle ze kolega nizej wyczerpal temat

Opublikowano

Dobra przeczytałem to kilka razy ale nie umiem zrozumieć. Jeśli wszystko zrobię w jednym(korzystając z klasy) pliku to działa bez żadnych problemów ale jak już rozbije tak jak zawsze działało to nie działa :/
Może ktoś miałby ochotę wytłumaczyć to trochę bardziej łopatologicznie. 

PS. muszę użyć template'u tylko dla jednej funkcji w klasie 

Opublikowano

Jeśli gdzieś używasz szablonu klasy to musisz zawsze includować także szablony metod (możesz np dołączać plik cpp na końcu pliku h tego szablonu klasy). Dzieje się tak dlatego, że 'metody' jakie definiujesz dla tego szablonu klasy to tylko szablony, a nie gotowe metody.

Podczas procesu kompilacji (nie linkowania) potrzebne klasy są generowane z szablonów, jednak żeby wygenerować definicję metod potrzebne są ich szablony (więc trzeba zaincludować właśnie te szablony metod).

 

PS. muszę użyć template'u tylko dla jednej funkcji w klasie

 

Wtedy sprawa jest taka sama jak wyżej.

Mógłbyś też przenieść jedynie definicję tej metody do pliku h, żeby nie musieć niepotrzebnie wszędzie includować wszystkich definicji.

Opublikowano

To jest magiczne :O
Może się to wydać głupie ale proszę o gotowca a może lepiej przykład w jaki sposób zrobić taką definicję.

Myślę że tak będzie mi to prościej zrozumieć.

Tzn. Gdybym potrzebował szablonu całej klasy to pewnie zabrał bym się już dawno za pisanie ale niestety tylko jedna metoda tego wymaga :/

Przeczytałem gdzieś na forum że można to rozwiązać pisząc deklaracje i definicje na dwa pliki nagłówkowe ale kiedy TO zobaczyłem to nie mam pojęcia jak tego użyć aby działało w moim przypadku.
 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...