C ++编译错误模板相关

时间:2017-04-25 15:16:25

标签: c++

我是c ++的新手,我有这段代码:

#include "passenger.h"
#include "plane_list.h"

int main(){
  plane_list<T>::plane_list();
  plane_list<T>::add();
}

我不明白也无法在网上找到答案为什么我会收到这些错误:

  

错误:此范围内未声明'T'   plane_list :: plane_list();

     

错误:模板参数1无效
  plane_list :: plane_list();

     

错误:';'标记之前的声明中的无效类型   plane_list :: plane_list();

     

错误:':: add'尚未声明为
  plane_list ::添加();

这是头文件:

template <class T> class plane_list{
friend class planes;
public:
  plane_list();
  ~plane_list();
  int search(const std::string &flight_code);
  plane_list<T> del(const std::string &flight_code);
  plane_list<T> add();

private:
  T *element;
  int length;

};

template <class T> plane_list<T>::plane_list(){
  element = new T[100];
  length=0;
}

template <class T> int plane_list<T>::search(const std::string &flight_code){
  for(int i=0;i<length;i++)if(element[i]._flight_code==flight_code)return i;
  return 0;
}

template <class T> plane_list<T> plane_list<T>::del(const std::string &flight_code){
  if(search(flight_code)!=0){
    for(int i=search(flight_code); i<length; i++)element[i-1]=element[i];
    length--;
    return *this;
  }
  else
    std::cerr<<"Did not find flight"<<std::endl;
}

template <class T> plane_list<T> plane_list<T>::add(){
  element[length]=planes::planes();
  length++;
  return *this;
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题是没有类型T。我假设plane_list是这样的模板类:

template<typename T>
class plane_list{
//...
}

此处,typename T是一个占位符,用于在实例化类时提供的某种类型。

您收到错误是因为您尝试使用不存在的类型实例化plane_list

要正确使用您的课程,您需要将T更改为其他类型:

//for example you could use an int
int main(){
  plane_list<int>::plane_list();
  plane_list<int>::add();
}

在不知道plane_list.h的内容的情况下,我无法推断出您实际上想要做什么。

编辑:

正如评论中所建议的那样。您使用不正确的语法来实例化和使用您的变量。正确的用法是:

int main(int argc, char** argv){
  //create a variable of type plane_list<int> names "list:
  plane_list<int> list; //default constructor is called automatically

  list.add(); ///call the member function "add"
}

此外,您的代码存在内存泄漏,您可以通过在构造函数中调用new来为动态存储分配数组'element',但不要在任何导致泄漏的地方调用delete element。有几种方法可以解决这个问题:

  1. 添加析构函数并在其中调用delete element
  2. 如果需要调整阵列大小,请使用std::vector<T>
  3. 如果您需要一个运行时确定长度的固定长度数组,请使用std::unique_ptr<T>

  4. 不要使用动态内存,因为要分配一个编译时间大小的数组。

  5. 我不会提供其中每一个的示例,但我建议您阅读C ++中的内存管理。

    浏览标题并确保更正函数调用语法。您可以在类中使用相同的错误语法。例如:

    template <class T> plane_list<T> plane_list<T>::add(){
      //element[length]=planes::planes();
      element[length]=planes{}; //default initialize a "planes" object
      length++;
      return *this;
    }