此片段在最后一行有一个拼写错误(缺少限定符:: type)。
template<bool ci> struct comp { typedef ci_compare_string type; };
template< > struct comp<false> { typedef std::less<std::string> type; };
template <typename T, bool ci = true> //map w str keys, case sensitive option
struct mapx : std::map<std::string, T, typename comp<ci> > {}; // oops, should be comp_<ci>::type
VS 2008编译器报告了如下所示的std :: map源代码行的错误。 消息是“术语不评估为采用2个参数的函数”。
...
mapped_type& operator[](const key_type& _Keyval)
{ // find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end()
|| this->comp(_Keyval, this->_Key(_Where._Mynode()))) <=== ERROR !!!!
_Where = this->insert(_Where,
value_type(_Keyval, mapped_type()));
return ((*_Where).second);
}
};
...
所以最终我发现错误必须与比较器有关,然后我盯着看,直到我意识到我忘了输入“:: type”。
之前我没有使用过很多w模板,并且想知道追溯像这样的编译器错误的正确方法。在这种情况下应该使用的任何提示/技巧?
答案 0 :(得分:4)
消息是“术语不评估为采用2个参数的函数”
在Visual Studio中,错误列表仅显示任何错误消息的第一行。它是一个易于浏览的错误摘要。某些错误消息很长,特别是涉及模板时。可以在Build的“输出”窗口中找到完整的错误消息。
在模板实例化期间发生错误时,编译器将打印在检测到错误时实例化的模板堆栈。例如,当我使用Visual C ++ 2012编译您的代码段时,它会输出以下错误(Visual C ++ 2008将打印类似的消息,但由于标准库实现的不同,它必然会有所不同):
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xtree(1792) : error C2064: term does not evaluate to a function taking 2 arguments
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xtree(1153) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::_Insert_nohint<std::pair<const _Kty,_Ty>&,std::_Tree_node<_Value_type,_Voidptr>*>(bool,_Valty,_Nodety)' being compiled
with
[
_Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>,
_Ty2=bool,
_Traits=std::_Tmap_traits<std::string,int,comp<true>,std::allocator<std::pair<const std::string,int>>,false>,
_Kty=std::string,
_Ty=int,
_Value_type=std::pair<const std::string,int>,
_Voidptr=void *,
_Valty=std::pair<const std::string,int> &,
_Nodety=std::_Tree_node<std::pair<const std::string,int>,void *> *
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xtree(1153) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::_Insert_nohint<std::pair<const _Kty,_Ty>&,std::_Tree_node<_Value_type,_Voidptr>*>(bool,_Valty,_Nodety)' being compiled
with
[
_Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>,
_Ty2=bool,
_Traits=std::_Tmap_traits<std::string,int,comp<true>,std::allocator<std::pair<const std::string,int>>,false>,
_Kty=std::string,
_Ty=int,
_Value_type=std::pair<const std::string,int>,
_Voidptr=void *,
_Valty=std::pair<const std::string,int> &,
_Nodety=std::_Tree_node<std::pair<const std::string,int>,void *> *
]
stubby.cpp(12) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert<std::pair<const char *,int>>(_Valty &&)' being compiled
with
[
_Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>,
_Ty2=bool,
_Traits=std::_Tmap_traits<std::string,int,comp<true>,std::allocator<std::pair<const std::string,int>>,false>,
_Valty=std::pair<const char *,int>
]
stubby.cpp(12) : see reference to function template instantiation 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert<std::pair<const char *,int>>(_Valty &&)' being compiled
with
[
_Ty1=std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const std::string,int>>>>,
_Ty2=bool,
_Traits=std::_Tmap_traits<std::string,int,comp<true>,std::allocator<std::pair<const std::string,int>>,false>,
_Valty=std::pair<const char *,int>
]
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xtree(1796) : error C2064: term does not evaluate to a function taking 2 arguments
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\xtree(1817) : error C2064: term does not evaluate to a function taking 2 arguments
现在,通过这些术语的任何定义,这仍然不是特别容易阅读或用户友好。但它确实显示了错误发生的位置。三个顶级错误发生在<xtree>
的第1792,1796和1817行,并且所有这些行都尝试使用比较器来比较两个参数。