仅在调用方法时编译错误?

时间:2018-03-20 03:24:22

标签: c++

我对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方法之前代码编译得很好呢?当我编译它并调用方法时以及编译它并且不调用该方法时,发生了什么?我认为它们应该产生相同的结果,尽管它们的运行时间不同。

1 个答案:

答案 0 :(得分:0)

就解析器而言,当它不考虑模板参数的类型时,语法是正确的。

您的声明语法正确,但用法不是语义正确。

第一个是在所有情况下成功编译的要求。只有在实际使用模板时才能确定第二个。

如果您要使用非模板化版本替换模板定义,请将int替换为K而将size_t替换为“V”,则会出现相同的编译错误,即使没有调用该函数。

模板基本上是破解前的预处理器宏。除非使用它们,否则它们不会被完全评估,并且使用不同的参数类型调用(或在实例化的情况下,使用模板化类)可能会产生完全不同的错误。

谨慎使用。你可以愉快地用光剑切片面包,但有时候武士刀是更好的选择。