C 编译误差模板相关

  • 本文关键字:编译 误差 c++
  • 更新时间 :
  • 英文 :


我是C 中的新手,我有此代码:

#include "passenger.h"
#include "plane_list.h"
int main(){
  plane_list<T>::plane_list();
  plane_list<T>::add();
}

我听不懂,我似乎也无法在网上找到答案,为什么我会遇到这些错误:

错误:在此范围中未声明" t"
bame_list :: blane_list((;

错误:模板参数1是无效的
bame_list :: blane_list((;

错误:在";"之前声明中的无效类型
phane_list :: phane_list((;

错误:‘:: add'尚未声明
bame_list :: add((;

这是标题文件:

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;
}

任何帮助将不胜感激。

问题是没有类型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来分配数组"元素",但切勿在任何导致泄漏的地方调用delete element。有几种解决此问题的方法:

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

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

我不会提供其中的每个示例,但是我建议阅读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;
}

最新更新