C2143 类型的错误 - 在 '<' 之前缺少 ','

Posted

技术标签:

【中文标题】C2143 类型的错误 - 在 \'<\' 之前缺少 \',\'【英文标题】:Error of type C2143 - Missing ',' before '<'C2143 类型的错误 - 在 '<' 之前缺少 ',' 【发布时间】:2013-02-15 06:13:22 【问题描述】:

我试图通过扩展抽象类linearList来定义具体类arrayList

我定义类的标题如下: 类数组列表:公共线性列表 我在第 4 行收到错误:error C2143: syntax error: missing ',' before '

当我通过扩展 linearList 来定义 chain 时也会发生这种情况。

我确保使用命名空间 std 并包含所有必要的文件。 linearList 类中没有错误,所以我认为这是 arrayList 中的错误。

我还在第 27 行收到错误“请参阅正在编译的类模板实例化 'arrayList' 的引用”(在代码中标记)。 arrayListlinearList 都包含在下面。

数组列表

#include <iostream>
using namespace std;
template<class T>
class arrayList : public linearList<T> 

public:
    // constructor, copy constructor and destructor
    arrayList(int initialCapacity = 10);
    arrayList(const arrayList<T>&);
    ~arrayList() delete [] element;
    // ADT methods
    bool empty() const return listSize == 0;
    int size() const return listSize;
    T& get(int theIndex) const;
    int indexOf(const T& theElement) const;
    void erase(int theIndex);
    void insert(int theIndex, const T& theElement);
    void output(ostream& out) const;
    // additional method
    int capacity() const return arrayLength;
protected:
    void checkIndex(int theIndex) const;
    // throw illegalIndex if theIndex invalid
    T* element;      // 1D array to hold list elements
    int arrayLength;       // capacity of the 1D array
    int listSize;          // number of elements in list
; //line 28
template<class T> 
arrayList<T>::arrayList(int initialCapacity)

    // Constructor.
    if (initialCapacity < 1)
    
        ostringstream s;
        s << "Initial capacity = " << initialCapacity << " Must be > 0";
        throw illegalParameterValue(s.str());
    
    arrayLength = initialCapacity;
    element = new T[arrayLength];
    listSize = 0;

template<class T>
arrayList<T>::arrayList(const arrayList<T>& theList)

    // Copy constructor.
    arrayLength = theList.arrayLength;
    listSize = theList.listSize;
    element = new T[arrayLength];
    copy(theList.element, theList.element + listSize, element); 

template<class T>
void arrayList<T>::checkIndex(int theIndex) const

    // Verify that theIndex is between 0 and 
    // listSize - 1.
    if (theIndex < 0 || theIndex >= listSize)
    
        ostringstream s;
        s << "index = " << theIndex << " size = " 
            << listSize;
        throw illegalIndex(s.str());
     

template<class T>
T& arrayList<T>::get(int theIndex) const

    // Return element whose index is theIndex.
    // Throw illegalIndex exception if no such
    // element.
    checkIndex(theIndex);
    return element[theIndex];

template<class T>
int arrayList<T>::indexOf(const T& theElement)const

    // Return index of first occurrence of theElement.
        // search for theElement
        int theIndex = (int) (find(element, element
        + listSize, theElement) - element);
    // check if theElement was found
    if (theIndex == listSize)
        return -1; // not found
    else return theIndex; 

template<class T>
void arrayList<T>::erase(int theIndex)
    // Delete the element whose index is theIndex.
    checkIndex(theIndex);
    // valid index, shift elements with higher
    // index
    copy(element + theIndex + 1, element + 
    listSize,element + theIndex);
    element[--listSize].~T(); // invoke destructor

template<class T>
void arrayList<T>::insert(int theIndex, const T& theElement)

    // Insert theElement.
    if (theIndex < 0 || theIndex > listSize)

    // invalid index
        // code to throw an exception comes here
    
    // valid index, make sure we have space
    if (listSize == arrayLength)
    
        // no space, double capacity
        changeLength1D(element, arrayLength, 
        2 * arrayLength);
        arrayLength *= 2;
    
    // shift elements right one position
    copy_backward(element + theIndex, 
    element + listSize,
    element + listSize + 1);
    element[theIndex] = theElement;
    listSize++;

template<class T>
void arrayList<T>::output(ostream& out) const

    // Put the list into the stream out.
    copy(element, element + listSize, 
        ostream_iterator<T>(out, "  ")); 

template <class T>
ostream& operator<<(ostream& out, const arrayList<T>& x)
x.output(out); return out;

线性列表

#include <ostream>

using namespace std;

template<class T>
class linearList 

public:
virtual ~linearList() 
virtual bool empty() const = 0;
virtual int size() const = 0;
virtual T& get(int theIndex) const = 0;
virtual int indexOf(const T& theElement)const = 0;
virtual void erase(int theIndex) = 0;
virtual void insert(int theIndex,const T& theElement) = 0;
virtual void output(ostream & out) const = 0;
;

【问题讨论】:

你是否包含了arraylist中的linearlist? 【参考方案1】:

lori 有正确的答案,但以防万一它不清楚:

arrayList 继承自 linearList,因此如果不知道 linearList 的定义,就无法定义 arrayList。这就是编译器在第 4 行抱怨的原因;它还不知道linearListusing namespace std 与这个问题无关,顺便说一句,在头文件中包含 using 语句是不好的做法。

假设您的“ArrayList”代码示例在array_list.h 和“LinearList”在linear_list.h,您应该将array_list.h 的前几行更改为:

#include <iostream>
#include "linear_list.h"

template<class T>
class arrayList : public linearList<T> 

public:
...

【讨论】:

以上是关于C2143 类型的错误 - 在 '<' 之前缺少 ','的主要内容,如果未能解决你的问题,请参考以下文章

VS编译错误:error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

C语言 error C2143: 语法错误 : 缺少“;”(在“类型”的前面)?

Cerror C2143: 语法错误 : 缺少“;”(在“类型”的前面)

MFC error C2143: 语法错误 : 缺少“;”(在“*”的前面)

error C2143: 语法错误 : 缺少“;”(在“&”的前面)

error C2143: 语法错误 : 缺少“;”(在“return”的前面)是怎么回事?