我对C ++很陌生,但我发现了一些我觉得很奇怪的东西。我有以下方法:
template <class K, class V>
bool BTree<K,V>::is_in_current_root(BTreeNode* subroot, const K& key){
if(!subroot){
return false;
}
for(int i = 0; i < subroot->elements.size(); i++){
if(subroot->elements[i] == key)
return true;
}
return false;
}
如果我从不调用此方法,它编译就好了。但是,只要我这样写了这样的调用:
if(!is_in_current_root(subroot,pair.key))
//do something
我收到消息:
fatal error: comparison of integers of different signs: 'int' and 'size_type' (aka 'unsigned long')
[-Wsign-compare]
for(int i = 0; i < subroot->elements.size(); i++){
我所知道的是一个问题(我最初没有意识到类型不匹配,在我专门调用该方法之前它并没有显示为问题)。那么为什么在调用isInCurrentRoot
方法之前代码编译得很好呢?当我编译它并调用方法时以及编译它并且不调用该方法时,发生了什么?我认为它们应该产生相同的结果,尽管它们的运行时间不同。
答案 0 :(得分:0)
就解析器而言,当它不考虑模板参数的类型时,语法是正确的。
您的声明语法正确,但用法不是语义正确。
第一个是在所有情况下成功编译的要求。只有在实际使用模板时才能确定第二个。
如果您要使用非模板化版本替换模板定义,请将int
替换为K
而将size_t
替换为“V”,则会出现相同的编译错误,即使没有调用该函数。
模板基本上是破解前的预处理器宏。除非使用它们,否则它们不会被完全评估,并且使用不同的参数类型调用(或在实例化的情况下,使用模板化类)可能会产生完全不同的错误。
谨慎使用。你可以愉快地用光剑切片面包,但有时候武士刀是更好的选择。