我将在前言中说我主要处理其他人编写的示例,因此我对模板类和朋友类的理解不足。我正在尝试编写循环列表类:
#ifndef CIRCLIST_H
#define CIRCLIST_H
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T>
class Node
{
public:
Node() : next(NULL), prev(NULL) {}
Node(const T& v) : value(v), next(NULL), prev(NULL) {}
T value;
Node<T>* next;
Node<T>* prev;
};
template <class T> class circList; //Forward declaration
template <class T>
class circIterator
{
public:
circIterator() : ptr(NULL) {}
~circIterator() {}
T& operator*() { return ptr->value; }
circIterator<T> & operator=(const circIterator<T> & old) { ptr = old.ptr; return *this; }
circIterator<T> & operator++() { ptr = ptr->next; return *this; }
circIterator<T> & operator--() { ptr = ptr->prev; return *this; }
friend class circList<T>;
friend bool operator==(const circIterator<T>& l, const circIterator<T>& r) { return l.ptr == r.ptr; }
friend bool operator!=(const circIterator<T>& l, const circIterator<T>& r) { return l.ptr != r.ptr; }
private:
Node<T>* ptr;
};
template <class T>
class circList
{
//class circIterator;
public:
circList() : entry(NULL), vsize(0) {}
~circList() {}
unsigned int size() const {return size;}
typename circList<T>::template circIterator<T> add(T const& v, circIterator<T> itr);
private:
Node<T>* entry;
unsigned int vsize;
};
template <class T>
typename circList<T>::template circIterator<T> circList<T>::add(T const& v, circIterator<T> itr)
{...}
当我编写一个简单的main.cpp时,它只是声明了一个circList,我得到错误:
error: no class template named 'circIterator' in 'class circList<int>'
错误引用最后一行,其中实现了add函数。这到底是什么意思?这是否意味着在某个地方我必须编码一个circIterator应该如何“归属于”circList?我真的不知道。
答案 0 :(得分:1)
该错误是由于circList<T>::template
您试图访问未为该类设置的标识符template
(这是一个关键字)这一事实引起的。
只需将函数定义为:
template <class T>
circIterator<T> circList<T>::add(T const& v, circIterator<T> itr) {...}
并声明为:
circIterator<T> add(T const& v, circIterator<T> itr);
here就是一个有效的例子。