Ho appena perso mezz'ora per un problema riassumibile con questo programmino minimale:
#include <map>
// #include <string>
int main()
{
using namespace std;
map<string,string> m;
m["sergio"] = "sergio";
return 0;
}
Il Visual C++ genera una sfilza di errori localizzati nel sorgente della libreria standard ! Non c'è nessun riferimento alla riga del mio sorgente che scatena l'errore. Se il programma fosse più complicato di questo ;-) diventerebbe difficile capire che l'errore è dovuto all'assenza del file header. L'unica soluzione è commentare pezzi di codice finché l'errore non sparisce.
Con il gcc la situazione è simile, ma almeno compare l'indicazione della riga nel mio sorgente che ha scatenato la sfilza di errori precedenti, se si ha la pazienza di leggere bene tutto l'output ;-)
L'esperienza insegna che quando si ottiene una sfilza di errori del genere, la prima cosa da andare a controllare è se sono stati inclusi tutti i file header.
Seguono gli errori generati dal Visual C++
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
provamappa.cpp
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(1170) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(138) : while compiling class-template member function 'bool std::less<_Ty>::operator ()(const _Ty &,const _Ty &) const'
with
[
_Ty=std::string
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\map(67) : see reference to class template instantiation 'std::less<_Ty>' being compiled
with
[
_Ty=std::string
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(23) : see reference to class template instantiation 'std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,_Mfl>' being compiled
with
[
_Kty=std::string,
_Ty=std::string,
_Pr=std::less<std::string>,
_Alloc=std::allocator<std::pair<const std::string,std::string>>,
_Mfl=false
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(65) : see reference to class template instantiation 'std::_Tree_nod<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<std::string,std::string,std::less<std::string>,std::allocator<std::pair<const std::string,std::string>>,false>
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(87) : see reference to class template instantiation 'std::_Tree_ptr<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<std::string,std::string,std::less<std::string>,std::allocator<std::pair<const std::string,std::string>>,false>
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(105) : see reference to class template instantiation 'std::_Tree_val<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<std::string,std::string,std::less<std::string>,std::allocator<std::pair<const std::string,std::string>>,false>
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\map(77) : see reference to class template instantiation 'std::_Tree<_Traits>' being compiled
with
[
_Traits=std::_Tmap_traits<std::string,std::string,std::less<std::string>,std::allocator<std::pair<const std::string,std::string>>,false>
]
provamappa.cpp(7) : see reference to class template instantiation 'std::map<_Kty,_Ty>' being compiled
with
[
_Kty=std::string,
_Ty=std::string
]
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(1170) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)' : could not deduce template argument for 'const std::_Tree<_Traits> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xtree(1170) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(655) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(655) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(655) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(73) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(73) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'const std::string'
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\utility(73) : see declaration of 'std::operator`<''
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\functional(139) : error C2676: binary '<' : 'const std::string' does not define this operator or a conversion to a type acceptable to the predefined operator
Mentre il g++ genera questi errori
/usr/include/c++/3.3/bits/stl_pair.h: In instantiation of `std::pair<const std::string, std::string>':
/usr/include/c++/3.3/bits/stl_tree.h:123: instantiated from `std::_Rb_tree_node<std::pair<const std::string, std::string> >'
/usr/include/c++/3.3/bits/stl_alloc.h:232: instantiated from `static _Tp* std::__simple_alloc<_Tp, _Alloc>::allocate(unsigned int) [with _Tp = std::_Rb_tree_node<std::pair<const std::string, std::string> >, _Alloc = std::__default_alloc_template<true, 0>]'
/usr/include/c++/3.3/bits/stl_tree.h:564: instantiated from `std::_Rb_tree_node<_Val>* std::_Rb_tree_alloc_base<_Tp, _Alloc, true>::_M_get_node() [with _Tp = std::pair<const std::string, std::string>, _Alloc = std::allocator<std::pair<const std::string, std::string> >]'
/usr/include/c++/3.3/bits/stl_tree.h:579: instantiated from `std::_Rb_tree_base<_Tp, _Alloc>::_Rb_tree_base(typename std::_Rb_tree_alloc_base<_Tp, _Alloc, std::_Alloc_traits<_Tp, _Allocator>::_S_instanceless>::allocator_type&) [with _Tp = std::pair<const std::string, std::string>, _Alloc = std::allocator<std::pair<const std::string, std::string> >]'
/usr/include/c++/3.3/bits/stl_tree.h:730: instantiated from `std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Rb_tree(const _Compare&, typename std::_Rb_tree_base<_Val, _Alloc>::allocator_type&) [with _Key = std::string, _Val = std::pair<const std::string, std::string>, _KeyOfValue = std::_Select1st<std::pair<const std::string, std::string> >, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, std::string> >]'
/usr/include/c++/3.3/bits/stl_map.h:144: instantiated from `std::map<_Key, _Tp, _Compare, _Alloc>::map() [with _Key = std::string, _Tp = std::string, _Compare = std::less<std::string>, _Alloc = std::allocator<std::pair<const std::string, std::string> >]'
provamap.cpp:10: instantiated from here
/usr/include/c++/3.3/bits/stl_pair.h:73: error: `std::pair<_T1, _T2>::first'
has incomplete type
/usr/include/c++/3.3/bits/stringfwd.h:56: error: declaration of `const struct
std::string'
/usr/include/c++/3.3/bits/stl_pair.h:74: error: `std::pair<_T1, _T2>::second'
has incomplete type
/usr/include/c++/3.3/bits/stringfwd.h:56: error: declaration of `struct
std::string'
provamap.cpp: In function `int main()':
provamap.cpp:12: error: no match for 'operator[]' in 'm["sergio"]'
/usr/include/c++/3.3/bits/stl_map.h:312: error: candidates are: _Tp&
std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key =
std::string, _Tp = std::string, _Compare = std::less<std::string>, _Alloc =
std::allocator<std::pair<const std::string, std::string> >]