Ik ben nog redelijk nieuw met C++, wel flinke MATLAB ervaring, maargoed dat helpt niet te veel.
Ik heb een library, zelf geschreven, waarin allerlei handige helper functies zitten, zoals een paar om makkelijk een reeks waarden in een std::vector te knallen. Die wil ik natuurlijk op zowel floats als doubles kunnen uitvoeren, dus heb ik er een template overheen gegooid. Als ik nu simpel onderstaande in de header en .cpp gooi gaat het niet goed.
Dan krijg ik linker errors als ik de functies uit mijn lib wil gebruiken, bijv.: "error LNK2001: unresolved external symbol:
Ik heb daar toen de volgende link op gevonden die het een en ander wel aardig uitlegde: Comeau Computing.
De oplossing hiervoor die ik gebruik (niet zelf bedacht) is dit:
Dit is naar omdat ik of vooruit moet kijken voor welke datatypes de functies beschikbaar moeten zijn, of elke keer als ik ergens tegen aanloop mijn libraries moet veranderen. Is er een andere/betere manier om dit aan te pakken of moet ik maar blijven duimen dat Microsoft ooit export implementeerd?
Ik heb een library, zelf geschreven, waarin allerlei handige helper functies zitten, zoals een paar om makkelijk een reeks waarden in een std::vector te knallen. Die wil ik natuurlijk op zowel floats als doubles kunnen uitvoeren, dus heb ik er een template overheen gegooid. Als ik nu simpel onderstaande in de header en .cpp gooi gaat het niet goed.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // easy vector assignment template <class T> void AssignVec(vector<T>* vector, const T& val0, const T& val1, const T& val2); template <class T> void AssignVec(vector<T>* vector, const T& val0, const T& val1, const T& val2, const T& val3); // .cpp // easy vector assignment template <class T> void AssignVec(vector<T>* vector, const T& val0, const T& val1, const T& val2) { (*vector).resize(3,0); (*vector)[0] = val0; (*vector)[1] = val1; (*vector)[2] = val2; } template <class T> void AssignVec(vector<T>* vector, const T& val0, const T& val1, const T& val2, const T& val3) { (*vector).resize(4,0); (*vector)[0] = val0; (*vector)[1] = val1; (*vector)[2] = val2; (*vector)[3] = val3; } |
Dan krijg ik linker errors als ik de functies uit mijn lib wil gebruiken, bijv.: "error LNK2001: unresolved external symbol:
code:
1
| error LNK2001: unresolved external symbol "void __cdecl AssignVec<float>(class std::vector<float,class std::allocator<float> > *,float const &,float const &,float const &)" (??$AssignVec@M@@YAXPAV?$vector@MV?$allocator@M@std@@@std@@ABM11@Z) |
Ik heb daar toen de volgende link op gevonden die het een en ander wel aardig uitlegde: Comeau Computing.
De oplossing hiervoor die ik gebruik (niet zelf bedacht) is dit:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
| // header // macro for instantiating different types to be assigned #define Instantiate_Assign(Type)\ template void AssignVec(vector<Type>* vector, const Type& val0, const Type& val1, const Type& val2);\ template void AssignVec(vector<Type>* vector, const Type& val0, const Type& val1, const Type& val2, const Type& val3); // .cpp // instantiate the various types to be assigned -- http://www.comeaucomputing.com/techtalk/templates/#export Instantiate_Assign(int); Instantiate_Assign(unsigned int); Instantiate_Assign(double); Instantiate_Assign(float); |
Dit is naar omdat ik of vooruit moet kijken voor welke datatypes de functies beschikbaar moeten zijn, of elke keer als ik ergens tegen aanloop mijn libraries moet veranderen. Is er een andere/betere manier om dit aan te pakken of moet ik maar blijven duimen dat Microsoft ooit export implementeerd?