我正在使用我的教师提供给我们的代码创建DLL。但是我试图在家编译它似乎不起作用。任何帮助将不胜感激。
template<class T>
class mySTLlist : public list<T> {
public:
void addInMiddle(T t){}
friend ostream& operator<<(ostream& out, mySTLlist<T>& lst) {
for(mySTLlist<T>::iterator i = lst.begin(); i != lst.end(); i++)
out << *i << ' ';
out << '\n';
return out;
};
它给我一个错误:
mySTLlist<T>::iterator i = lst.begin();
它说我之前需要一个;
并且没有声明它。
我对C ++比较陌生
答案 0 :(得分:2)
这很好地说明了为什么包含完整的示例以及读取所有错误消息的重要性。您的代码缺少一些包含标题;至少,它需要以下顶部:
#include<list>
#include<iostream>
using namespace std;
当我更正那些并在最后添加缺少的}
并编译它时,我得到三个错误:
foo.cpp:14:9: error: need 'typename' before 'mySTLlist<T>::iterator' because
'mySTLlist<T>' is a dependent scope
foo.cpp:14:32: error: expected ';' before 'i'
foo.cpp:14:49: error: 'i' was not declared in this scope
第一个说我们需要添加“typename”(请注意,这是引号,意思是文字关键字typename
,而不是类型的名称),所以我们添加了它所说的我们需要的内容,将该行更改为:
for(typename mySTLlist<T>::iterator i = lst.begin(); i != lst.end(); i++)
解决了这个问题。您看到的错误是一个后续错误 - 因为i
的声明是错误的,它跳过它以查看它可以对文件的其余部分做什么。下次使用i
时,它会抱怨它尚未声明(当然,因为它跳过了声明) - 同样,缺少;
错误也是因为它是如何跳过第一个错误的。因此,修复第一个问题,然后修复其余问题。
答案 1 :(得分:1)
您必须添加迭代器typedef:
typedef typename mySTLlist<T>::iterator myListIter;
然后写:
friend ostream& operator<<(ostream& out, mySTLlist<T>& lst) {
for(myListIter i = lst.begin(); i != lst.end(); i++)
out << *i << ' ';
out << '\n';
return out;