Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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++_Types_Vector_Mismatch - Fatal编程技术网

C++ 向量类型值不匹配错误

C++ 向量类型值不匹配错误,c++,types,vector,mismatch,C++,Types,Vector,Mismatch,尝试运行程序时,我收到以下错误消息: 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 ar

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

 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) ===
但是,如果我将向量的类型替换为int,它将正确运行。 注释掉以下行时:std::vector enemyList;它可以编译,但是如果它在那里,它就不会编译 当宣布这样的敌人时 敌人e(5)

它运行正常

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

CPP:

标题

#ifndef ENEMY_H
#define ENEMY_H

class Enemy
{
    public:

        Enemy(  );
        ~Enemy();

    protected:
    private:

};



#endif // ENEMY_H
它仍然会因相同的错误而崩溃,这意味着它必须是主要的

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

要有某个值类型的
向量,该类型必须有一个可用的无参数构造函数,而您的构造函数则没有(即,错误消息告诉您的就是这个)。但是,由于我怀疑您是否想复制
敌人
s,您应该通过指针来存储它们,即

vector<Enemy*> enemies;
for (int i = 0; i < NUM_ENEMIES; ++i)
    enemies.push_back(new Enemy(type));
但是您还声明了一个枚举值

enum render {... ,Enemy, ....
我刚刚编译了以下代码,得到了一个可疑的类似错误:

#inlcude <vector>


class A {};

enum type {A, B, C};

std::vector<A> As;

int main(int argc, char** argv)
{
  return 0;
}
#包括
A类{};
枚举类型{A,B,C};
std::向量As;
int main(int argc,字符**argv)
{
返回0;
}

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

要有某个值类型的
向量,该类型必须有一个可用的无参数构造函数,而您的构造函数则没有(即错误消息告诉您的)。但是,由于我怀疑您是否想复制
敌人
s,您应该通过指针来存储它们,即

vector<Enemy*> enemies;
for (int i = 0; i < NUM_ENEMIES; ++i)
    enemies.push_back(new Enemy(type));
但是您还声明了一个枚举值

enum render {... ,Enemy, ....
我刚刚编译了以下代码,得到了一个可疑的类似错误:

#inlcude <vector>


class A {};

enum type {A, B, C};

std::vector<A> As;

int main(int argc, char** argv)
{
  return 0;
}
#包括
A类{};
枚举类型{A,B,C};
std::向量As;
int main(int argc,字符**argv)
{
返回0;
}

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

对于某些函数,
std::vector
要求
T
是默认可构造的。您的
敌人
类不能默认构造,因此编译器会发出错误。为
敌人
定义默认构造函数,不要调用需要默认可构造性的
向量
函数,或者将
向量
更改为其他类型

考虑到
virtual
在敌方中的使用,以及
std::vector
永远无法接受派生类,再加上您使用了令人厌恶的全局变量、C数组和其他糟糕的代码,我想假设您不知道发生了什么


std::vector
只能容纳
敌人
。它不能持有
敌方
或任何其他派生类。它只能容纳敌人
。如果您希望拥有可能是各种派生类的事物的
向量
,则必须使用某种所有权的指针。这意味着您必须解决谁拥有被指向的对象的问题,并且必须进一步理解所有权的概念以及可用的智能指针。这是C++的基本知识,没有它你不会走很远。

对于某些函数,<代码> STD::vector < /Cord>要求<代码> t <代码>默认可构造。您的
敌人
类不能默认构造,因此编译器会发出错误。为
敌人
定义默认构造函数,不要调用需要默认可构造性的
向量
函数,或者将
向量
更改为其他类型

考虑到
virtual
在敌方中的使用,以及
std::vector
永远无法接受派生类,再加上您使用了令人厌恶的全局变量、C数组和其他糟糕的代码,我想假设您不知道发生了什么


std::vector
只能容纳
敌人
。它不能持有
敌方
或任何其他派生类。它只能容纳敌人
。如果您希望拥有可能是各种派生类的事物的
向量
,则必须使用某种所有权的指针。这意味着您必须解决谁拥有被指向的对象的问题,并且必须进一步理解所有权的概念以及可用的智能指针。这是C++的基本知识,没有它你就不会走很远。错误发生在这里你能把它减少到一个最小的测试用例吗,这样我们就不必费力地阅读所有其他的代码了?有header,敌方的构造函数,还有main的include语句(#include“include/敌方.h”),还有敌方对象向量的声明(std::vector enemyList;//这里发生错误)。不知道。一切看起来都很好。我猜还有其他一些事情是你没有提到的,导致了这个问题。开始评论敌方.h中的内容,看看你是否能用这种方式孤立它。也许也可以尝试在向量之外声明一个敌人,看看这是否有效//错误发生在这里。你能把它减少到一个最小的测试用例吗?这样我们就不必费力地阅读所有其他的代码了?有header和foreign的构造函数,还有main的include语句(#include“include/foreign.h”)和declar
enum render {... ,Enemy, ....
#inlcude <vector>


class A {};

enum type {A, B, C};

std::vector<A> As;

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