Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

04.09.2015, 17:47

C++ Fehler bei Template Klasse die mit Struct initialisiert werden soll

Bin gerade dabei mir eine Klasse für eine Baumstruktur zu schreiben, da ich diese evtl. für verschiedene Dinge verwenden will, wollte ich daraus ein Template machen. Die Daten die in der Baumstruktur gespeichert werden sind dabei immer Structs die verschiedene Daten gespeichert haben, je nach Anwendung. Sobald ich es aber benützen will bekomme ich LNK2019 Fehler. Ich habs schon versucht zu Googeln, aber das hat mich nur noch mehr verwirrt. Weil ich da auf etwas gestoßen bin, nachdem das mit meinen Compiler evtl. garnicht geht und erst mit dem neuen C++ Standard, aber da bin ich mir nicht sicher in wie weit. Wie gesagt hat mich mehr verwirrt. Benützen aufjedenfall noch VisualStudio 10.

Mal zu meiner Klasse:
.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef TREE_LINKER
#define TREE_LINKER

#include <vector>

struct data_base;

struct coord_data_2
{
    int y;
    int x;
};

template<typename T >
class c_tree_linker
{
    private:

        struct data_base
        {
            T data;
            data_base *origin;
            std::vector< data_base* > childs;
        };

        data_base *act_pos;

        std::vector< data_base > storer;

    public:
        
        c_tree_linker( T root_data );

        T& insert_child( T child_data );
        bool forward( int child_pos );
        bool backward( int pos );
        T& get_data();

};

#endif


.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "tree_linker.hpp"

template<typename T >
c_tree_linker<T>::c_tree_linker( T root_data )
{
    data_base temp;

    temp.data = root_data;
    temp.origin = NULL;

    storer.push_back( temp );

    act_pos = &storer[ storer.size() - 1 ];
}

template<typename T >
T& c_tree_linker<T>::insert_child( T child_data )
{
    data_base temp;

    temp.data = child_data;
    temp.origin = act_pos;

    storer.push_back( temp );

    ( *act_pos ).childs.push_back( &storer[ storer.size() - 1 ] );

    act_pos = &storer[ storer.size() - 1 ];

    return &( *act_pos ).data;
}

template<typename T >
bool c_tree_linker<T>::forward( int child_pos )
{
    if ( ( *act_pos ).childs.size() < child_pos )
    {
        act_pos = ( *act_pos ).childs( child_pos );

        return true;
    }

    return false;
}

template<typename T >
bool c_tree_linker<T>::backward( int pos )
{
    for ( size_t i = 0 ; i < pos ; i++ )
    {
        if ( ( *act_pos ).origin == NULL )
        {
            return false;
        }
        else
        {
            act_pos = ( *act_pos ).origin;
        }
    }

    if ( ( *act_pos ).childs.size() < child_pos )
    {
        act_pos = ( *act_pos ).childs( child_pos );

        return true;
    }

    return true;
}

template<typename T >
T& c_tree_linker<T>::get_data()
{
    return &( *act_pos ).data;
}


Soweit sogut, das Compiliert er mir auch, aber sobald ich es benützen will:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
coord_data_2 temp_pos;
coord_data_2 *act_pos;

temp_pos.y = unit_main[ side ][i].y;
temp_pos.x = unit_main[ side ][i].x;

c_tree_linker< coord_data_2 > move_found( temp_pos ); // das hier
act_pos = &move_found.get_data(); // und das hier bringen dann einen LNK2019 Fehler


Die Fehler:

C-/C++-Quelltext

1
2
1>ai_managment.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: class coord_data_2 & __thiscall c_tree_linker<class coord_data_2>::get_data(void)" (?get_data@?$c_tree_linker@Vcoord_data_2@@@@QAEAAVcoord_data_2@@XZ)" in Funktion ""public: void __thiscall c_ai_managment::ai_run(int)" (?ai_run@c_ai_managment@@QAEXH@Z)".
1>ai_managment.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall c_tree_linker<class coord_data_2>::c_tree_linker<class coord_data_2>(class coord_data_2)" (??0?$c_tree_linker@Vcoord_data_2@@@@QAE@Vcoord_data_2@@@Z)" in Funktion ""public: void __thiscall c_ai_managment::ai_run(int)" (?ai_run@c_ai_managment@@QAEXH@Z)".



Ich wollte das Struct zuerst vor dem benützen erst erstellen, danach habs ich in die Klasse des Baumes reingesteckt in der Hoffnung dann müsste er es ja kennen. Was aber nichts bringt.

Soweit ich jetzt nachgelesen hatte sollte es mit einem neueren Compiler sogar klappen wenn es außerhalb der Klasse definiert ist und von dem Template eigentlich nicht gekannt wird. Mache ich jetzt Grundlegend etwas falsch oder geht das garnicht mit meinen Compiler. Müsste ich für meine Compiler Version das Struct irgendwie anders definieren, das es von dem Template erkannt wird?

Alternativ könnte ich natürlich das Template auch weglassen und einfach mehrere Klassen basteln die dann auf die einzelnen Structs zugeschnitten sind oder auf eine neue VisualStudio Version umsteigen. Aber bevor ich da was mache, wollte ich lieber nachfragen, vllt gibt es ja auch eine einfachere Lösung oder ich mache einfach nur eine Kleinigkeit falsch.

2

04.09.2015, 17:54

Den Code der cpp-Datei in den Header packen! (copy & paste von cpp in hpp)
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

3

04.09.2015, 19:05

Danke. Frag mich echt warum ich das über Googel nicht gefunden hab, meine Suchwörter sind, wie ich schon immer befürchtete, wohl wirklich mies. :dash:

Jetzt kann ich das Struct auch wieder aus der Klasse rausschieben.

Sehe auch gerade, das man den Code nicht genauer ansehen sollte, da stecken einige Fehler noch drin. Gut das ich sie gerade beim Ansehen hier noch entdeckt habe, dann muss ich mich nicht wieder über seltsame Ergebnisse im Programm wundern, woher die kommen. Muss da wohl noch einiges über Templates lernen, weil in einer normalen Klasse würd er mir einen der Fehler so schon um die Ohren hauen. :D

Werbeanzeige