模板化 class 语法错误

Templated class syntax errors

我有这些树 classes.

一个ListTraits.h,一个List.hmain.cpp

List.h 是 list 的模板化实现,它继承自 ListTraits.h

虽然我相信我的模板设置 class 是正确的,

我遇到了几个语法错误,它们似乎不应该存在:

具体来说,对于 Listh.h 我得到:

(line 8) ..

Node<typename>* head;

Error C2143 语法错误:缺少“;”在 '<' main

之前

错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int main

然后是一系列其他错误,但这两个最没有意义。

这些是我的文件。

List.h

    #pragma once
#include "ListTraits.h"
//------------ Declarations for List traits used in Test1 in main.cpp

template <typename> class List: public ListTraitsExtended<typename>, 
                                public ListTraits<typename> {
private:
    Node<typename>* head;
public:
    List() {head = NULL;}
    
    unsigned int size() {return 0;}

    ListTraits& insert(const typename& item) {return null;}

    void print() {}
//------------ Declarations for List traits used in Test2 in main.cpp
    const typename* getCurrentElement() const {}

    void advance() {}

    void rewind() {}
};

ListTraits.h

    #pragma once

//------------ Declarations for List traits used in Test1 in main.cpp
template <typename T> class ListTraits
{
    public:
        virtual unsigned int size() = 0;
        virtual ListTraits& insert(const T& item) = 0;
        virtual void print() = 0;
};

//------------ Declarations for List traits used in Test2 in main.cpp
template <typename T> class ListTraitsExtended
{
    public:
        virtual const T* getCurrentElement() const = 0;
        virtual void advance() = 0;
        virtual void rewind() = 0;
};

typename 是一个 关键字 ,不是类型的实际名称。

List.h 中,当您从 ListTraitsExtended<typename>ListTraitsExtended<typename> 派生并使用 Node<typename> 时,您会导致语法错误,因为这些模板需要 type 传递给它,而你传递给它的是 keyword.

您应该给 List 的主模板命名,例如将其更改为 template <typename T>,然后将命名类型 T 传递给每个模板:

template <typename T> class List: public ListTraitsExtended<T>, 
//                 ^ name it here                           ^ use it here
                                  public ListTraits<T> {
//                                                  ^ use it here
private:
    Node<T>* head;
//       ^ and here