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::vector enemyList; それはコンパイルされますが、この Enemy e(5); のように Enemy を宣言するとコンパイルされません。

それは正しく実行されます

更新:敵のヘッダーと 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

それでも同じエラーでクラッシュします。これは、メインの何かである必要があることを意味します

修正: なんらかの理由で、列挙型の上の行で宣言すると機能しますが、下で機能しない場合、理由がわかりません。誰かがこれを説明できる場合は、先に進んでください。

4

2 に答える 2

3

一部の関数では、デフォルトで構築可能であるstd::vector<T>必要があります。TクラスEnemyをデフォルトで構築することはできないため、コンパイラはエラーを発行します。の既定のコンストラクターを定義するか、既定の構成可能性を必要とする関数をEnemy呼び出さないか、またはを別の型に変更してください。vectorvector

virtualEnemy での使用、および派生クラスを受け入れることができないこと、さらに、嫌なグローバル変数、C 配列、その他のひどいコードの使用を考えると、std::vector<Enemy>何が起こっているのかわからないと仮定します。

Astd::vector<Enemy>は のみを保持できEnemyます。の派生クラスEnemyまたはその他のものを保持することはできません。のみ保持できますEnemy。さまざまな派生クラスである可能性があるものを取得したいvector場合は、ある程度の所有権を持つポインターを使用する必要があります。これは、指しているオブジェクトを誰が所有しているかという問題を解決する必要があることを意味し、さらに、所有権の概念と利用可能なスマート ポインターを理解する必要があります。これは C++ にとって不可欠な知識であり、これがなければ先に進むことはできません。

于 2013-06-04T23:42:22.230 に答える