При попытке запустить программу я получаю следующее сообщение об ошибке:
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:
По какой-то причине, когда я объявляю это в строке выше моих перечислений, это работает, однако, если ниже это не так, я понятия не имею, почему. Если кто-то может объяснить это, пожалуйста, продолжайте.
Иметь vector
какого-то типа значения, тип должен иметь доступный конструктор без аргументов, а ваш — нет (т. е. это то, что сообщается вам в сообщении об ошибке). Тем не менее, так как я сомневаюсь, что вы хотите копировать вокруг Enemy
s, вы должны хранить их по указателю, т.е.
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 (которое может быть параметром шаблона, как и любой другой целочисленный тип) и предполагает, что это именно то, что вы имели в виду. Однако, поскольку ни один векторный шаблон не соответствует (все они имеют класс в качестве первого параметра шаблона), он не компилируется. Отсюда твоя ошибка.
Для некоторых функций std::vector<T>
требует, чтобы T
быть конструируемым по умолчанию. Ваш Enemy
Класс не может быть построен по умолчанию, поэтому компилятор выдает ошибку. Либо определите конструктор по умолчанию для Enemy
, не звони vector
функции, которые требуют конструктивности по умолчанию, или изменить vector
быть другого типа.
Учитывая virtual
использовать в Enemy, и это std::vector<Enemy>
Я никогда не смогу принять производный класс, плюс вы используете отвратительные глобальные переменные, массивы C и другой ужасный код. Я собираюсь предположить, что вы понятия не имеете, что происходит.
std::vector<Enemy>
может только держать Enemy
, Он не может содержать производный класс Enemy
или что-нибудь еще. Это может только держать Enemy
, Если вы хотите иметь vector
вещей, которые могут быть различными производными классами, вы должны использовать указатель некоторой степени владения. Это означает, что вы должны решить проблему того, кому принадлежат объекты, на которые указывают, и, кроме того, вы должны понимать концепцию владения и какие умные указатели доступны. Это важные знания для C ++, и вы не добьетесь больших успехов без них.