【问题标题】:fields could not be resloved, while it's obviously there! (implementing a map.h)田野不能再爱了,而它显然就在那里! (实现一个map.h)
【发布时间】:2014-01-16 15:10:36
【问题描述】:

我正在用 C++ 编写地图数据结构的通用代码。 它应该基于一个链表,所以实际上我喜欢把它想象成一个有 2 个条目而不是一个条目的链表。 所以首先,我有以下(模板)类: const_iterator, iterator, Map, Node.

与问题相关的类是地图(使用所有其余部分的主类)和 Node.js。他们是这样定义的:

template<class K, class T>
class Map {
    class Node;
    Node* head;
    Node* first;
    Node* firstDemoNode;
    Node* lastDemoNode;
    int sizeOfMap;
    Node* searchAux(K& key);

当然,这些只是字段,我没有包含方法。 和 Node 类:

template<class K, class T>
class Map<K, T>::Node {
       friend class Map<K, T> ;
       T data;
   K key;
   Node* prev;
   Node* next;
   bool isDemo;
   friend class const_iterator;
}

最后一个类,const_iterator:

class Map<K, T>::const_iterator {
friend class Map<K, T> ;
const Map<K, T>::Node* node;
const Map<K, T>* map;

这个问题很奇怪。 const_iterator 的一些使用 Node 类的方法,当我尝试使用它时无法识别节点类,即当我实现如下方法时:

const T& getData() {
        return node->data;
    }

编译器 (eclipse, g++) 告诉我“字段‘数据’无法重新保存 也一样:

const K& getKey() {
    return node->key;
}

typename Map<K, T>::const_iterator& operator++() {
    if (node != NULL) {
        node = node->prev;
    }
    return *this;
}
typename Map<K, T>::const_iterator& operator--() {
    if (node != NULL) {
        node = node->next;
    }
    return *this;
}

如果无法解析的字段是节点之后的字段->

我会很感激任何帮助,很抱歉发了这么长的帖子。 提前感谢您的帮助!

【问题讨论】:

  • "the compiler (eclipse, g++)" 那里好像有点混乱,eclipse是ide,g++是编译器。谁告诉你的?在我看来,这是日食。你试过编译吗?
  • 我认为有些typename 不见了。
  • 无法复制:ideone.com/nJCw44。你能发布一个完整的例子,以及确切的错误信息吗?或者这只是 Eclipse 未能索引代码(就像它经常做的那样),而不是编译错误?
  • @Jarod42:这将需要使用依赖类型名称,但这些错误显然来自依赖数据成员名称,不需要任何限定。
  • @wannabeprogrammer: 少量重现错误的代码将是理想的。这是很多代码,并且不会重现它,即使我添加了 main() 来实例化有问题的成员函数。同样,您确定这是一个真正的编译器错误,而不仅仅是 Eclipse 显示虚假错误?

标签: c++ eclipse map


【解决方案1】:

根据您发布的代码 sn-ps,我在 Eclipse 中生成了以下测试用例(还删除了一些不必要的东西):

template<class K, class T>
class Map {
    class Node;
    class const_iterator;
};

template<class K, class T>
class Map<K, T>::Node {
   friend class Map<K, T> ;
   friend class const_iterator;
   T data;
};

template<class K, class T>
class Map<K, T>::const_iterator {
    friend class Map<K, T>;
    const Map<K, T>::Node* node;
    const T& getData() { return node->data; }
};

int main() {
    Map<int, int> test;
}

这编译得很好,除了test 未使用的警告,但这并不重要。

但是 Eclipse 仍然(即使在编译之后)显示代码分析错误 const T&amp; getData() { return node-&gt;data; } 行:

Field 'data' could not be resolved

不是实际错误,而是通知,代码分析器无法在实时分析中解析名称。您可以放心地忽略此警告。这些代码分析错误用红色或黄色错误标记,而编译器错误(更相关)用红色叉号标记。静态代码分析应该可以帮助您在编写代码时发现(语义)错误,但它并不完美,而且我有误报。

在这种情况下,node 的类型直到编译时才知道,因此分析器不知道这些字段。 (虽然我觉得分析应该足够复杂,可以确定这里可能的类型,或者至少将其识别为不完整的,因此不会显示任何错误。)

您可以配置这些错误是否/如何显示在Window -&gt; Preferences -&gt; C/C++ -&gt; Code Analysis 中。您可以从扫描中排除其中的完整文件,但我不知道有一种方法可以在一行中禁用特定错误消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多