Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试在C+;中使用列表时编译错误+;_C++_List - Fatal编程技术网

C++ 尝试在C+;中使用列表时编译错误+;

C++ 尝试在C+;中使用列表时编译错误+;,c++,list,C++,List,我尝试在C++中使用list,但是我得到以下错误: 1> 错误C2143:语法错误:缺少“;”在“之前,类模板需要完整的类型声明来实例化自身。确保已包含声明hgeVector的头文件 顺便说一句,您的头中有“使用名称空间std”-这不是一个好做法。它会给当前名称空间引入不必要的名称。我认为您有循环的“includes”。您将Includes.h包含在Polygon.h中,并将Polygon.h包含在Includes.h中。问题可能是在使用命名空间std之前,正在处理行列表顶点,因此编译器不知道列

我尝试在C++中使用list,但是我得到以下错误:


1> 错误C2143:语法错误:缺少“;”在“之前,类模板需要完整的类型声明来实例化自身。确保已包含声明hgeVector的头文件


顺便说一句,您的头中有“使用名称空间std”-这不是一个好做法。它会给当前名称空间引入不必要的名称。

我认为您有循环的“includes”。您将
Includes.h
包含在
Polygon.h
中,并将
Polygon.h
包含在
Includes.h

中。问题可能是在
使用命名空间std之前,正在处理行
列表顶点
,因此编译器不知道
列表是什么(没有
std::
名称空间限定符)。我不清楚这些语句的处理顺序,因为您的两个文件彼此包含,我也不知道非标准的
#pragma once
将如何处理这一问题

在任何情况下,请尝试将
list
限定为
std::list

编辑:假设
#pragma once
与include-guards一样工作,那么如果其他文件包含.h,则会出现此问题,但如果其他文件包含Polygon.h,则不会出现此问题。如果另一个文件包含includes.h,发生的情况是includes.h到达
#include
,编译器开始处理Polygon.h。但是,当到达Polygon.h内的
#include
时,由于已经定义了
INCLUDES
保护,因此不会有效地包含任何内容,因此您不会使用名称空间std获取


一般来说,尽量避免循环包含,而更喜欢向前声明。

确保定义了
hgeVector

您可能在某个地方重新定义了列表。尝试使用
std::list


尝试一些非常简单的方法,比如
std::list

只是一些一般性的评论

 #define PI 3.14159
请在
math.h
中使用
M_PI
,即3.141592653589793238462643

#include "\include\hge.h"
#include "\include\hgesprite.h"
#include "\include\hgefont.h"
#include "\include\hgeparticle.h"
#include "\include\hgerect.h"
您应该在此处使用前斜杠
/
,并删除
包含
之前的前导
\

using namespace std;
在头文件中避免这种情况。这将污染所有其他用户的全局命名空间。(因此,您应该在
Polygon.h
中使用
std::list texts;

答案(正如泰勒·麦克亨利所指出的)是圆形包含

在整理了我的include之后,我得到了如下编译代码(即使没有列表前面的std::infront:

#pragma once

#include <list>
#include "D:\Programmering\haffes\hge181\include\hge.h"
#include "D:\Programmering\haffes\hge181\include\hgevector.h"
using namespace std;

using namespace std;

class MyPolygon
{
public:
    MyPolygon(void);
    ~MyPolygon(void);

    void addVertice(hgeVector v);
    void renderPolygon();
    void setHotSpot(hgeVector v);
    void translate(hgeVector v);
private:
    list<hgeVector> vertices;
    hgeVector hotSpot;
    bool hotSpotUndef;
};
#pragma一次
#包括
#包括“D:\Programmering\haffes\hge181\include\hge.h”
#包括“D:\Programmering\haffes\hge181\include\hgevector.h”
使用名称空间std;
使用名称空间std;
类MyPolygon
{
公众:
MyPolygon(void);
~MyPolygon(void);
无效附加值(hgeVector v);
void renderPolygon();
void setHotSpot(hgeVector v);
无效转换(hgeVector v);
私人:
列出顶点;
hgeVector热点;
布尔温泉酒店;
};

感谢大家提供了快速而好的答案!

值得一提的是,
安全删除
是一个糟糕的主意。它会掩盖代码中的逻辑问题。使用智能指针(例如
boost::scoped_ptr
boost::shared_ptr
boost::scoped_array
boost::shared_array
)相反。为什么还要在安全删除中使用
if(d)
呢?@Per
safe\u delete
是没有用的,实际上,删除空指针是安全的!更不用说所有标准的“宏是邪恶的”使用给定的
safe\u delete
:re safe\u delete实现时出错的方式,Stroustrup建议这样做:
template inline void destroy(T*&p){delete p;p=0;}
如果有一个guardance marco或“pragma once”,这不是问题,对吧?这很可能就是问题。
#pragma once
应该防止这种情况,但可能不是。问题是include-guards。请仔细考虑使用命名空间std
行和
列表的
会发生什么ne当第三个文件写入
#include
时,我应该在polygon.cpp中包含“polygon.h”并在polygon.h中包含“Includes.h”吗?编辑:它没有解决问题。OP应该使用MSVC,它支持一次
#pragma
。它是类模板,而不是模板类(因为它是实例化类的模板,而不是相反的方式)。谢谢-对于非英语母语人士来说,总是很难找出微妙的英语术语。我已经解决了这个问题。+1提到在标题中使用命名空间std;
是不好的做法。你是说“转发声明”吗?非常感谢!在将std::置于列表之前之后,它起到了作用,避免了像
#include“D:\Programmering\haffes\hge181\include\hge.h”
这样的东西。这就是为什么编译器支持使用
-I目录将其添加到include路径。然后,即使代码位于其他地方,代码也会编译。
using namespace std;
#pragma once

#include <list>
#include "D:\Programmering\haffes\hge181\include\hge.h"
#include "D:\Programmering\haffes\hge181\include\hgevector.h"
using namespace std;

using namespace std;

class MyPolygon
{
public:
    MyPolygon(void);
    ~MyPolygon(void);

    void addVertice(hgeVector v);
    void renderPolygon();
    void setHotSpot(hgeVector v);
    void translate(hgeVector v);
private:
    list<hgeVector> vertices;
    hgeVector hotSpot;
    bool hotSpotUndef;
};