我是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;
}
任何帮助都将不胜感激。
答案 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
。有几种方法可以解决这个问题:
delete element
。std::vector<T>
。如果您需要一个运行时确定长度的固定长度数组,请使用std::unique_ptr<T>
。
不要使用动态内存,因为要分配一个编译时间大小的数组。
我不会提供其中每一个的示例,但我建议您阅读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;
}