Ik ben wat met template classes en functies aan het spelen, en produceerde op een gegeven moment een stuk code waarvan VC.net 2003 me een flauwe error gaf. Niet dat ik 'm niet snap, maar ik had verwacht dat ie daar wel uit zou komen. Echter, toen ik vervolgens de code door Comeau draaide om te checken of die het wel snapte, kwam die met een volgens mij helemaal idiote error.
Het geisoleerde stukje code is:
Wat ik bij deze code zou verwachten: in de MySort regel herkent ie dat het een vector<int> is, wat het t_DataType argument vastlegt. Dit lukt ook. Vervolgens kan ie daarmee de parameter van de template functie die als default gebruikt is vastleggen, waarmee impliciet het template argument t_Predicate ook bekend is indien er geen 2e parameter meegegeven wordt. Geen kip en ei problemen zou je zo zeggen. VC.net 7.1 roept echter:
Niet lief
Ik vind dat ie er gewoon niet genoeg moeite voor doet 
Maar als ik vervolgens de code door Comeau Online tryout draai flipt die helemaal:
En wie heeft daar ooit een std::allocator ingestopt? Niet ik
De vragen dus: Waarom komt Comeau met die allocator op de proppen? Waarom gaat ie zo vreemd op z'n bek als ie geen fatsoenlijke reden ervoor heeft? Hoort deze code volgens de C++ standaarden te werken? Zijn er alternatieven behalve een overload van MySort maken met 1 parameter?
Het geisoleerde stukje code is:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <vector> template <class t_DataType> bool StdPredicate(const t_DataType& p_Low, const t_DataType& p_High); template <class t_DataType, class t_Predicate> void MySort(const std::vector<t_DataType> &p_Vector, t_Predicate p_Predicate = StdPredicate<t_DataType>); int main() { std::vector<int> l_Vector; MySort(l_Vector); return 0; } |
Wat ik bij deze code zou verwachten: in de MySort regel herkent ie dat het een vector<int> is, wat het t_DataType argument vastlegt. Dit lukt ook. Vervolgens kan ie daarmee de parameter van de template functie die als default gebruikt is vastleggen, waarmee impliciet het template argument t_Predicate ook bekend is indien er geen 2e parameter meegegeven wordt. Geen kip en ei problemen zou je zo zeggen. VC.net 7.1 roept echter:
code:
1
2
| error C2783: 'void MySort(const std::vector<t_DataType> &,t_Predicate)' :
could not deduce template argument for 't_Predicate' |
Niet lief
Maar als ik vervolgens de code door Comeau Online tryout draai flipt die helemaal:
code:
1
2
3
4
5
6
| "ComeauTest.c", line 11: error: no instance of function template "MySort" matches the argument list The argument types that you used are: (std::vector<int, std::allocator<int>>) MySort(l_Vector); ^ |
En wie heeft daar ooit een std::allocator ingestopt? Niet ik
De vragen dus: Waarom komt Comeau met die allocator op de proppen? Waarom gaat ie zo vreemd op z'n bek als ie geen fatsoenlijke reden ervoor heeft? Hoort deze code volgens de C++ standaarden te werken? Zijn er alternatieven behalve een overload van MySort maken met 1 parameter?
[ Voor 7% gewijzigd door curry684 op 01-02-2004 01:21 . Reden: layout ]