我正在用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;
之后的字段我很感激任何帮助,对不起,我很遗憾。 在此先感谢您的帮助!
答案 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
中是否显示这些错误/如何显示这些错误。您可以从中扫描完整文件,但我不知道在一行上禁用特定错误消息的方法。