为什么我不能在C ++中声明成员函数

时间:2017-09-10 14:50:34

标签: c++ templates inheritance

我正在构建一个C ++列表程序。有一个ADT List,它是一个纯粹的虚拟模板类,SLL(单链表)继承自。我在sll.h中编写了类定义,并试图在sll.cpp中实现该列表。但是我不断收到以下两个错误,

1)

In file included from cpp_files/sll.cpp:1:0,
                 from main.cpp:3:
cpp_files/../includes/sll.h:3:25: error: expected class-name before ‘{’ token
 class SLL : public List {

2)

cpp_files/../includes/sll.h:12:54: error: cannot declare member function ‘List<L>::insert’ within ‘SLL’
        void List<L>::insert( L element, int position );

我的问题,发生了什么事?为什么这不起作用?

SLL.cpp
#include "../includes/sll.h"
/*
 Singly Linked List Implementation
*/
SLL::SLL() {}

SLL::~SLL() {}

template <class L>
void List<L>::insert( L element, int position ) {

}
SLL.H
#include "../includes/list.h"

class SLL : public List {
    private:
    public:

       SLL();

       ~SLL();

       template <class L>
       void List<L>::insert( L element, int position );

};

List.h

#ifndef LIST_H
#define LIST_H

/*
In this code we define the headers for our ADT List.
*/
template<class L>
class List {

private:

public: // This is where functions go

  typedef struct node {
      int data;
      node* next;
  } * node_ptr;

  virtual void insert( L element, int position ) = 0;

};


#endif // LIST_H

1 个答案:

答案 0 :(得分:2)

List是一个模板,因此您需要指定模板参数

class SLL : public List // no template parameter specified!

需要像

这样的东西
class SLL : public List<int> // now we have a complete type

或者您需要将模板参数添加到SLL

template<class L>
class SLL : public List<L> // now the user of SLL tells us the complete type

此外,您无法将模板定义的一部分放在单独的cpp文件中,因此如果您使SLL成为模板类,则需要将其整个定义放在标题中。所有模板都一样。