Een bepaalde instantie van std::map geraakt niet door de compiler, op zich niet zo speciaal, ware het niet dat wanneer ik dezelfde map (zelfde template args) in een andere, op nodige includes na blanco .cpp file instantieer, het wel goed gaat ...
De map in kwestie, met de nodige typedefs:
Ook gek is dat, in de beruchte cpp file waar het mis gaat, volgende map instanties wel door de compiler geraken:
cpp file (zie lijn 19) waarin het wel goed gaat, dat ik nu specifiek .begin() aanroep is niet de oorzaak van het plots wel compileren.
De beruchte source file (zie lijn 22) waarin de map niet door de compiler geraakt:
De compilatie error komt neer op dat hij geen conversie van const PolygonSignature (een tuple) kan doen naar const WSSVertex* (= VertexID).
Uiteraard kan dat niet, maar ik snap niet hoe hij daar ooit bij zou moeten komen ...
Volledige log: http://pastebin.com/m5c457aec
Ik begin te denken dat er een foutje in de compiler of de std libs van VS 2010 zit, maar met mijn prille kennis van C++ zou ik dat niet zomaar durven zeggen. Zeker omdat in situaties als deze het vroeger steeds mijn eigen fout bleek te zijn.
Hebben jullie nog ideeen die kunnen helpen om uit te zoeken waardoor dit veroorzaakt wordt?
De map in kwestie, met de nodige typedefs:
C++:
1
2
3
4
| typedef const WSSVertex* VertexID; typedef std::tr1::tuple<VertexID,VertexID,VertexID> PolygonSignature; std::map<SerializedBasePolygon::PolygonSignature, const SerializedBasePolygon*> test; |
Ook gek is dat, in de beruchte cpp file waar het mis gaat, volgende map instanties wel door de compiler geraken:
C++:
1
2
3
| std::map<int, const SerializedBasePolygon*> test1; std::map<PolygonSignature, SerializedBasePolygon*> test2; std::map<PolygonSignature, const int*> test3; |
cpp file (zie lijn 19) waarin het wel goed gaat, dat ik nu specifiek .begin() aanroep is niet de oorzaak van het plots wel compileren.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include "stdafx.h" #include "SerializedBasePolygon.h" #include <iostream> using std::vector; using std::cerr; using std::endl; vector<XVec3> SerializedBasePolygon::getSubsampled(unsigned int downSamples, std::map<PolygonSignature, const SerializedBasePolygon*>& nbMap) const{ if(downSamples > mmResolution) { cerr << "lowering downsamples to " << mmResolution << endl; downSamples = mmResolution; } vector<XVec3> lowRes; nbMap.begin(); return lowRes; } |
De beruchte source file (zie lijn 22) waarin de map niet door de compiler geraakt:
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
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
| #include "stdafx.h" #include "SerializedBasePolygon.h" #include <iostream> using std::vector; using std::cerr; using std::endl; vector<XVec3> SerializedBasePolygon::getSubsampled(unsigned int downSamples, std::map<PolygonSignature, const SerializedBasePolygon*>& nbMap) const{ // OPT: cache the neighbour pointers if(downSamples > mmResolution) { cerr << "lowering downsamples to " << mmResolution << endl; downSamples = mmResolution; } vector<XVec3> lowRes; // get the two side borders ------- hier struikelt de compiler over nbMap vector<XVec3> border0 = nbMap[mmNeighbours[1]]->getBorderData(downSamples, mmVertices[0], getBottomLeft()); vector<XVec3> border1 = nbMap[mmNeighbours[7]]->getBorderData(downSamples, mmVertices[0], mmVertices.back()); lowRes.push_back(nbMap[mmNeighbours[0]]->getDownSampledCorner(downSamples, mmVertices[0], border0.front())); lowRes.push_back(nbMap[mmNeighbours[8]]->getDownSampledCorner(downSamples, mmVertices[0], border1.front())); // first row done // do the local data except for the last line unsigned int localOffset = 0; unsigned int localLineSize = 0; for(unsigned int borderIndex = 0; borderIndex != border0.size(); ++borderIndex){ ++localLineSize; localOffset += localLineSize; lowRes.push_back(border0[borderIndex]); lowRes.insert(lowRes.end(), mmVertices.begin() + localOffset, mmVertices.begin() + localOffset + localLineSize); lowRes.push_back(border1[borderIndex]); } lowRes.push_back(nbMap[mmNeighbours[2]]->getDownSampledCorner(downSamples, getBottomLeft(), border0.back())); // add the bottom of the local data lowRes.insert(lowRes.end(), mmVertices.begin() + calculateNrVertices(1 << mmResolution), mmVertices.end()); lowRes.push_back(nbMap[mmNeighbours[6]]->getDownSampledCorner(downSamples, mmVertices.back(), border1.back())); // add the bottom border data lowRes.push_back(nbMap[mmNeighbours[3]]->getDownSampledCorner(downSamples, getBottomLeft(), border0.back())); auto bottomborder = nbMap[mmNeighbours[4]]->getBorderData(downSamples, getBottomLeft(), mmVertices.back()); lowRes.insert(lowRes.end(), bottomborder.begin(), bottomborder.end()); lowRes.push_back(nbMap[mmNeighbours[5]]->getDownSampledCorner(downSamples, mmVertices.back(), bottomborder.back())); return lowRes; } |
De compilatie error komt neer op dat hij geen conversie van const PolygonSignature (een tuple) kan doen naar const WSSVertex* (= VertexID).
Uiteraard kan dat niet, maar ik snap niet hoe hij daar ooit bij zou moeten komen ...
Volledige log: http://pastebin.com/m5c457aec
Ik begin te denken dat er een foutje in de compiler of de std libs van VS 2010 zit, maar met mijn prille kennis van C++ zou ik dat niet zomaar durven zeggen. Zeker omdat in situaties als deze het vroeger steeds mijn eigen fout bleek te zijn.
Hebben jullie nog ideeen die kunnen helpen om uit te zoeken waardoor dit veroorzaakt wordt?