字段无法解决,而它显然在那里! (实现map.h)

时间:2014-01-16 15:10:36

标签: c++ eclipse map

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

与问题相关的类是map(使用所有其余的主类)和Node。这是他们定义的方式:

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;
问题非常奇怪。使用Node类的const_iterator的一些方法在我尝试使用它时不识别节点类,即当我实现类似的方法时:

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;
}

无法解析的字段是在节点&gt;

之后的字段

我很感激任何帮助,对不起,我很遗憾。 在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

从你发布的代码片段中我在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& getData() { return node->data; }的代码分析错误:

Field 'data' could not be resolved

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

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

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