1

当我尝试运行我的程序时收到以下错误消息:

 main.cpp|44|error: type/value mismatch at argument 1 in template
 parameter list for 'template<class _Tp, class _Alloc> class
 std::vector' main.cpp|44|error: expected a type, got '(render)3u'
 main.cpp|44|error: template argument 2 is invalid main.cpp|44|error:
 invalid type in declaration before ';' token
 === Build finished: 4 errors, 0 warnings (0 minutes, 0 seconds) ===

这是导致错误导致行的主要代码:

#include<stdlib.h>
#include<windows.h>
#include<GL/glut.h>
#include<GL/freeglut.h>
#include<iostream>
#include <vector>
#include "include/Block.h"
#include <string>
#include <sstream>
#include "include/TextBlock.h"
#include "include/Enemy.h"
string text;
stringstream ss;
enum render {Normal,SelectRangeText,SelectSText,Enemy,EnemyTypeSelection};
enum render state;
enum type { Foreground, Background, Midground };
enum type selected;
enum types { Blocks, Enemies, Text };
enum types special;
string names[4]  = { "grass" , "smallGrassBlock" , "dirt" , "sand" };
void createEnemy(int,int);
void addEnemyWaypoint(int,int);
void addToList(vector<Block> &list,int x,int y);
void placeText(int x,int y);
void initTextures();
GLint GetTexture(string file);
void IdleFunction();
void removeBlock(int x,int y);
int xOffset,yOffset,multiuse = 0;
using namespace std;
string to_string(int number);
void placeBlock(int x,int y);
void drawBitmapText(char *string, float x, float y, float z);
void reshape(int w, int h);
void render(void);
void keyboard(unsigned char c,int x,int y);
void mouse(int button,int state, int x, int y);
void arrows(int key, int x, int y );
std::vector <Block> backBlockList;
std::vector <TextBlock> textBlockList;
std::vector <Block> midBlockList;
std::vector <Block> foreBlockList;
std::vector <Enemy> enemyList;//error occurs here
GLuint  textures[1];
unsigned int screenXSize=800;
unsigned int screenYSize=800;
unsigned int selectedBlockType = 1;
int main(int argc, char ** argv)
{

敌人的标题:

#ifndef ENEMY_H
#define ENEMY_H
#include<GL/freeglut.h>
#include <vector>
class Enemy
{
    public:
        Enemy(int Type );
        virtual ~Enemy();
        void render(int,int,GLuint);
        void addWaypoint(int,int);
    protected:
    private:
        int type;
        std::vector <int> X, Y;
        int xsize,ysize;
};
#endif // ENEMY_H

敌人的构造函数:

Enemy::Enemy(int Type)
{
    xsize=30;
    ysize=30;
    type=Type;
}

但是,如果我将向量的类型替换为 int,它将正确运行。当以下行被注释掉时:std::vectorenemyList; 它可以编译,但是如果它在那里,则在声明像这样的 Enemy e(5) 之类的 Enemy 时不会编译;

它运行正常

更新:如果我将敌人的标题和 cpp 更改为以下内容:

共产党:

#include "../include/Enemy.h"


Enemy::Enemy( )
{

}


Enemy::~Enemy()
{
    //dtor
}

标题

#ifndef ENEMY_H
#define ENEMY_H

class Enemy
{
    public:

        Enemy(  );
        ~Enemy();

    protected:
    private:

};



#endif // ENEMY_H

它仍然因相同的错误而崩溃,这意味着它必须是 main 中的某些东西

修复:由于某种原因,当我在枚举上方的行中声明它时它可以工作,但是如果在它下面没有,我不知道为什么。如果有人可以解释这一点,请继续。

4

2 回答 2

3

对于某些功能,std::vector<T>要求它T是可默认构造的。您的Enemy类不能是默认构造的,因此编译器会发出错误。为 定义一个默认构造函数Enemy,不要调用vector需要默认可构造性的函数,或者将 更改vector为不同的类型。

鉴于virtual在 Enemy 中的使用,并且它std::vector<Enemy>永远不会接受派生类,再加上你使用令人作呕的全局变量、C 数组和其他糟糕的代码,我将假设你不知道发生了什么。

Astd::vector<Enemy>只能持有一个Enemy. 它不能包含的派生类Enemy或其他任何东西。它只能持有Enemy。如果您希望拥有vector可能是各种派生类的东西,则必须使用某种程度的所有权指针。这意味着您必须解决谁拥有所指向的对象的问题,并且您必须进一步了解所有权的概念以及可用的智能指针。这是 C++ 的基本知识,没有它你不会走得太远。

于 2013-06-04T23:42:22.230 回答
2

要具有vector某种值类型,该类型必须具有可用的无参数构造函数,而您的构造函数没有(即,这就是错误消息告诉您的内容)。但是,由于我怀疑您是否要复制Enemys,因此您应该通过指针存储它们,即。

vector<Enemy*> enemies;
for (int i = 0; i < NUM_ENEMIES; ++i)
    enemies.push_back(new Enemy(type));

编辑我刚刚注意到你有以下声明

class Enemy...

但你也声明了一个枚举值

enum render {... ,Enemy, ....

我刚刚编译了以下代码并得到了一个可疑的类似错误:

#inlcude <vector>


class A {};

enum type {A, B, C};

std::vector<A> As;

int main(int argc, char** argv)
{
  return 0;
}

所以有你的问题。当需要解析模板时,编译器会看到一个枚举值(它可以是模板参数,就像任何其他整数类型一样),并假设这就是您的意思。但是,由于没有向量模板匹配(它们都有一个类作为第一个模板参数),它不会编译。因此,你的错误。

于 2013-06-04T23:16:13.270 回答