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;
}