2012-02-01 68 views
0

我正在使用由我的教师提供给我们的代码创建一个DLL。不过,我试图在家里编译它,但似乎并不奏效。任何帮助,将不胜感激。我在C++中创建一个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++

+1

除非你至少错过了一段代码,否则你会错过一个大括号。 – Rig 2012-02-01 23:56:42

回答

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时,它会抱怨它没有被声明(当然这是因为它跳过了声明),同样,错误的;错误是因为它跳过了第一个错误。因此,修复第一个问题,并解决其余问题。

+0

我假设你使用gcc,因为它给你提供了很好的错误信息,但是很可能根据编译器不会显示信息错误消息。 – 2012-02-02 00:16:02

+0

嘿谢谢,这解决了这个问题,但后来我得到一个不明身份的引用错误,但它确实编译。感谢您的帮助 – Bill 2012-02-02 00:20:44

+0

@Jesse你说得对,在这种情况下MSVC不会抱怨... – vitakot 2012-02-02 00:23:12

1

您必须添加一个iterator的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; 
+0

为什么这需要'typedef',而不是直接在'i'的声明中写'typename mySTLlist :: iterator'? – 2012-02-02 00:07:44

+0

我不需要'typedef',这只是我想到的第一件事...... :)我不是英语母语的人,所以有更多的时间我会写一些与您的答案非常相似的东西。为了从C++的问题中获得一些噶,必须要快速;有这么多的C++大师,我总是迟到我的答案 - 在这种情况下:) – vitakot 2012-02-02 00:19:04

+0

公平的。我希望我错过了一些有用的东西。 :) – 2012-02-02 02:26:26

相关问题