Ошибка несоответствия значения типа с векторами

При попытке запустить программу я получаю следующее сообщение об ошибке:

 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 :: vector врага; он компилируется, однако если он там не
когда объявляешь врага вот так
Враг е (5);

он работает правильно

Обновления:
Если я изменю вражеский заголовок и cpp на что-то вроде следующего:

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

Он по-прежнему вылетает с той же ошибкой, это означает, что это должно быть что-то в основном

FIX:
По какой-то причине, когда я объявляю это в строке выше моих перечислений, это работает, однако, если ниже это не так, я понятия не имею, почему. Если кто-то может объяснить это, пожалуйста, продолжайте.

1

Решение

Иметь 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;
}

Так вот в чем твоя проблема. Когда приходит время разрешить шаблон, компилятор видит значение enum (которое может быть параметром шаблона, как и любой другой целочисленный тип) и предполагает, что это именно то, что вы имели в виду. Однако, поскольку ни один векторный шаблон не соответствует (все они имеют класс в качестве первого параметра шаблона), он не компилируется. Отсюда твоя ошибка.

2

Другие решения

Для некоторых функций std::vector<T> требует, чтобы T быть конструируемым по умолчанию. Ваш Enemy Класс не может быть построен по умолчанию, поэтому компилятор выдает ошибку. Либо определите конструктор по умолчанию для Enemy, не звони vector функции, которые требуют конструктивности по умолчанию, или изменить vector быть другого типа.

Учитывая virtual использовать в Enemy, и это std::vector<Enemy> Я никогда не смогу принять производный класс, плюс вы используете отвратительные глобальные переменные, массивы C и другой ужасный код. Я собираюсь предположить, что вы понятия не имеете, что происходит.

std::vector<Enemy> может только держать Enemy, Он не может содержать производный класс Enemy или что-нибудь еще. Это может только держать Enemy, Если вы хотите иметь vector вещей, которые могут быть различными производными классами, вы должны использовать указатель некоторой степени владения. Это означает, что вы должны решить проблему того, кому принадлежат объекты, на которые указывают, и, кроме того, вы должны понимать концепцию владения и какие умные указатели доступны. Это важные знания для C ++, и вы не добьетесь больших успехов без них.

3

По вопросам рекламы [email protected]