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.