我将通过说我主要是在处理别人写的例子来前言这一点,所以我对模板类和朋友类的理解是低于标准的。
#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?我真的不知道
该错误是由以下事实引起的:在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是工作示例。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(66条)