我知道这个标题有点令人困惑但是图表可能会有所帮助。 在一个文件中:
#ifndef ...
#def ...
#includes (including OListiterator.h>
template <class T>
class OList;
template <class T>
Class OListiterator{
friend class OList<T>::OList;
typename OList<T>::Node* iiter;
};
function defs;
#endif
在另一个:
#ifndef ...
#def ...
#includes (one is OList.h)
template<class T>
class OListiterator;
template <class T>
Class OList{
friend class OListiterator<T>::OListiterator;
public:
class Node{
};
//things
};
//functions
#endif
这就是我和TA协助我认为会起作用的,但我抛出了错误:Node没有在OList中命名一个类型。有谁知道我为什么/如何解决这个问题?如果我需要发布更多内容,请告诉我。
答案 0 :(得分:0)
看起来这里存在依赖关系。 OList
需要OListIterator
,反之亦然。解决这个问题的方法是改变你的设计,这样就不需要这种依赖。尝试放置OListIterator
设计,以便在OList
内使用。
答案 1 :(得分:0)
您需要class OList
的正向声明:
// forward declaration
template <class T>
class OList;
template <class T>
class OListiterator{
friend class OList<T>::OList;
typename OList<T>::Node* iiter;
};
template <class T>
class OList{
friend class OListiterator<T>::OListiterator;
public:
class Node{
};
};
请注意,friend class OList<T>::OList;
仅相当于friend class OList<T>;
,因为OList<T>::OList
是在OList<T>
范围内注入的类名。
答案 2 :(得分:0)
当您将Node
的成员OList
命名为朋友时,编译器需要OList
的完整定义以确保存在此类成员。
解决方案是打破依赖性。为什么列表节点需要访问列表迭代器的内部?在我看来应该是相反的。