explicit specialization of ‘Race‘ after instantiation ,implicit instantiation first required here。

news/2024/7/1 5:13:48

报错1:
E:\project\qt\Pokemon3\PokemonServer\pokemon.cpp:470: error: specialization of ‘Race::Race() [with int N = 0]’ after instantiation
Race<0>::Race() : PokemonBase(ATK)
^
报错2:
explicit specialization of ‘Race’ after instantiation
implicit instantiation first required here

instantiation 实例化
specialization 特殊化/具体化

错误原因:显示具体化放在实例化之后,这里首先需要隐式实例化

查阅资料后了解到:
显式具体化声明在关键字 template后面包含<>,而显式实例化没有。

源码 pokemon.h
template <int N>
class Race : public PokemonBase
{
public:Race();virtual ~Race() = default;bool attack(Pokemon& attacker, Pokemon& aim, string& msg, int skillIndex = 0) const;
};源码pokemon.cpptemplate <>
Race<0>::Race() : PokemonBase(ATK)
{// _raceName = "Charmander";_raceName = "小火龙";_expCurve[0] = 5;for (int i = 1; i < 14; ++i){_expCurve[i] = _expCurve[i - 1] + 5 * i;}_skillName[0] = "撞击";_skillName[1] = "火花";_skillName[2] = "怒气";_skillName[3] = "火球";_skillDscp[0] = "普通攻击";_skillDscp[1] = "忽略敌人一半防御的攻击";_skillDscp[2] = "增加攻击力";_skillDscp[3] = "伤害很高的大招";_pp[0] = 10;_pp[1] = 3;_pp[2] = 5;
}template <>
bool Race<0>::attack(Pokemon& attacker, Pokemon& aim, string& msg, int skillIndex) const
{// dbout << attacker.name() << " uses " << attacker.skillName(skillIndex) << "!\n";msg += attacker.skillName(skillIndex) + ' ';switch (skillIndex){case 1: //spark{if (dodge(attacker.cspeed(), aim.cspeed(), msg))return false;int dmg = attacker.catk() + attacker.lv() * 2 - aim.cdef() / 2 + f(4);// return aim.takeDamage(dmg);bool result = aim.takeDamage(dmg);msg += to_string(aim.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(aim.cpp(i)) + ' ';}msg += to_string(attacker.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(attacker.cpp(i)) + ' ';}return result;break;}case 2:				 //ragemsg += "0 "; // can not dodgeattacker.changeAtk(attacker.atk() / 8);msg += to_string(aim.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(aim.cpp(i)) + ' ';}msg += to_string(attacker.hp()) + " 2 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(attacker.cpp(i)) + ' ';}break;case 3: //fireball{if (dodge(attacker.cspeed(), aim.cspeed(), msg))return false;int dmg = attacker.catk() * 1.5 - aim.cdef() + 8 + f(4 + attacker.lv());bool result = aim.takeDamage(dmg);msg += to_string(aim.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(aim.cpp(i)) + ' ';}msg += to_string(attacker.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(attacker.cpp(i)) + ' ';}return result;break;}default:{//普通攻击if (dodge(attacker.cspeed(), aim.cspeed(), msg))return false;int dmg = attacker.catk() - aim.cdef() + f(4);bool result = aim.takeDamage(dmg);msg += to_string(aim.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(aim.cpp(i)) + ' ';}msg += to_string(attacker.hp()) + " 1 1 1 ";for (int i = 0; i < 3; ++i){msg += to_string(attacker.cpp(i)) + ' ';}return result;break;}} //switchreturn false;
}
//共实例化了四个类,不一一例举

调用优先级:普通函数>显式具体化>显式实例化>普通模版

也就是具体化应该在实例化之前,我做的是具体化,之前的实例化在哪?

发现在以上程序前还有这样一段代码:

PokemonBase* Race0 = new Race<0>();
PokemonBase* Race1 = new Race<1>();
PokemonBase* Race2 = new Race<2>();
PokemonBase* Race3 = new Race<3>();const PokemonBase* Pokemon::races[] = {Race0,Race1,Race2,Race3};

我们可以回到本源上思考,模板类是减少代码量而产生,模板类定义了,真正的类还没有定义,既然没有定义,新建也就无从谈起

解决方案是将后一段代码移植到前一段代码下方,问题解决。


http://lihuaxi.xjx100.cn/news/242528.html

相关文章

JSP显示页面和数据库乱码

页面 和 数据库编码都是UTF-8&#xff0c;但就是奇怪。 指定Tomcat的编码为UTF-8 就行了

Atitit.提升 升级类库框架后的api代码兼容性设计指南

Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加&#xff0c;版本号在注释上面增加1 2. 废弃api&#xff0c;使用主见dep1 3. 修改api&#xff0c;1 4. 修改依赖import&#xff0c;雅瑶增加文件模式。保持兼容性。。1 5. 优先选择同一个文件内的修改&am…

web前端培训:本期教程CSS 三大特性

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级&#xff1a; 1. 层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题。 层叠性原则&#xff1a; 样式冲突&#xff0c;遵循的原则是就近…

kerberos java实现,基于kerberos实现jaas登录

这段时间在做hadoop和kerberos的整合&#xff0c;顺便看了jaas和kerberos&#xff0c;这里给出使用kerberos登录模块的jaas例子。前提条件1.kerberos已经安装&#xff0c;principal已经创建&#xff0c;这里用的principal是已经建好的nn/adminpsy.com;2.客户端配置了kerberos&a…

讲座记录:从码农到架构师(精简版)

1.框架学习 不要过于在乎细节 学封装思想 不追新 否则太累 每个框架的设计理念不同 spring 比structs 优秀在哪&#xff1f; 关注增量而非全量 2.如何快速学习一门新技术 “新框架的产生速度远大于个人的学习速度” 先快速学习:了解模板&#xff0c;套路-重复出现的代码 类似做…

SpringMVC 返回json

1.页面传递json数据&#xff0c;ajax传递 jsp <script type"text/javascript">$(document).ready(function(){$("#add").click(function(){var userName $("#userName").attr("value");var age $("#age").attr("…

Java3大框架的学习都是什么

java是互联网行业的第一编程语言&#xff0c;相信大家都已经有了解了&#xff0c;事实也确实如此&#xff0c;java还是世界第一编程语言&#xff0c;在java培训学习的过程中&#xff0c;框架是程序员们必学的知识点&#xff0c;而且是十分重要的应用&#xff0c;Spring、Struts…

POJO、JavaBean、DAO

POJO POJO全称是Plain Ordinary Java Object / Plain Old Java Object&#xff0c;中文可以翻译成&#xff1a;普通Java类&#xff0c;具有一部分getter/setter方法的那种类就可以称作POJO。一般在web应用程序中建立一个数据库的映射对象时&#xff0c;我们只能称它为POJO。 Ja…