gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:19 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

如果您要用非模板化版本替换您的模板定义,用 int 代替 K 并用 size_t 代替 `V',即使未调用该函数,您也会遇到相同的编译错误。

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

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

关于c++ - 仅在调用方法时编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49375884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com