模板化 class 语法错误
Templated class syntax errors
我有这些树 classes.
一个ListTraits.h
,一个List.h
和main.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
我有这些树 classes.
一个ListTraits.h
,一个List.h
和main.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