explicit specialization of ‘Race‘ after instantiation ,implicit instantiation first required here。
报错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};
我们可以回到本源上思考,模板类是减少代码量而产生,模板类定义了,真正的类还没有定义,既然没有定义,新建也就无从谈起
解决方案是将后一段代码移植到前一段代码下方,问题解决。
相关文章:

(转载)Linux usbtouchscreen驱动分析
在Linux内核中自带USB触摸屏驱动,以linux-2.6.33.3\drivers\input\touchscreen.c为例,进行解析: 1.驱动加载: static int __init usbtouch_init(void){return usb_register(&usbtouch_driver); //驱动注册} 其中usbtouch_dr…

关于事务隔离级别
2019独角兽企业重金招聘Python工程师标准>>> 第一种 read uncommitted 此状态下脏读,不可重复读,虚读都有可能发生。此状态下两个人同时操作一个数据库表一边开启事务没有提交,另一边也开启事物开始更改数据但是也没有提交&#x…

Datawhale组队学习周报(第047周)
本周报总结了从 2021年01月03日至2022年01月09日,Datawhale组队学习的运行情况,我们一直秉承“与学习者一起成长的理念”,希望这个活动能够让更多的学习者受益。 第 32 期组队学习一共 11 门开源课程,共组建了 11 个学习群&#…

讲座记录:从码农到架构师(精简版)
1.框架学习 不要过于在乎细节 学封装思想 不追新 否则太累 每个框架的设计理念不同 spring 比structs 优秀在哪? 关注增量而非全量 2.如何快速学习一门新技术 “新框架的产生速度远大于个人的学习速度” 先快速学习:了解模板,套路-重复出现的代码 类似做…

Enterprise Library 4 数据访问应用程序块
Enterprise Library 数据访问应用程序块简化了实现常规数据访问功能的开发任务。应用程序可以在各种场景中使用此应用程序块,例如为显示而读取数据、传递数据穿过应用程序层( application layers)、以及将修改的数据提交回数据库系统。应用程序块包含对存储过程和内…
虚拟货币市值回调到4100亿整数关口,EOS逆势站上100关口
虚拟货币虚拟货币市值在过去24小时中,虚拟货币整体回调,市值为4100亿美元。只有EOS逆势上扬,已经站上了100元(17.5美元)上方。虚拟货币市场距离12月份最高点几乎只有一步之遥。EOS走势EOS这种疯狂的势头是很多人预料未…

【NCEPU】韩绘锦:图信号处理与图卷积神经网络
韩绘锦是华北电力大学数理系大四的学生,LSGO软件技术团队(Dreamtech算法组)/Datawhale成员,也在天池比赛中取得了不错的成绩,现保送大连理工大学软件工程学院深造。 希望参与我们线下组队学习的同学,可以在…

什么是python第三方库
Python计算生态 标准库 第三方库 标准库:随解释器直接安装到操作系统中的功能模块 第三方库:需要经过安装才能使用的功能模块 模块的概念:库Library、包Package、模块Module 出处:北理工Python慕课

Task01:青少年软件编程(Scratch)等级考试模拟卷(二级)
试题来源 青少年软件编程(Scratch)等级考试试卷(二级)【2019.09】青少年软件编程(Scratch)等级考试试卷(二级)【2019.12】青少年软件编程(Scratch)等级考试试…

App功能测试的注意点
好几个月没有写博客记录学习心得了,这次回老家深夜闲来无事写一篇记录下这段时间的面试心得,这次面试过程很多面试官都问APP的有关测试,下面我就自己的认识和工作中的经验来谈谈自己对APP测试的认识: 1.push消息推送测试 检查push…

编程以外积累: 如何给项目生成类似VS2008的说明文档
1:【下载】 目前微软提供的官方开源工具 Sandcastle 结果跑到项目中一看,抬头就来了这么一段: The Sandcastle CodePlex project is no longer under active development by Microsoft and as such, there will be no future releases to t…

python的turtle绘图体系入门必看(一)
1 设置窗体 turtle.setup(width,height,startx,starty) 说明: setup()函数不是必须的前两个参数代表窗体的横向宽与纵向长后两个参数可选,表示窗体距离屏幕的横向距离和纵向距离(也可以理解为窗体左上角距离屏幕左上角的横向和纵向距离&…

交换两个变量的值不使用第三个变量(Java)
关于这个问题网上有好多答案,最近有人说这是个奇葩问题 个人测试了一把,如果是普通的数字的话,基本上没有问题 public static void main(String[] args) {int a 2147483647;int b 2147483646;// aab;// ba-b;// aa-b;// b a (a b) * 0; …

Task02:青少年软件编程(Scratch)等级考试模拟卷(二级)
电子学会 软件编程(图形化)二级训练营 试题来源 青少年软件编程(Scratch)等级考试试卷(二级)【2019.09】青少年软件编程(Scratch)等级考试试卷(二级)【2019…

Visual Studio 15.7预览版4改进Git、C++支持
\看新闻很累?看技术新闻更累?试试下载InfoQ手机客户端,每天上下班路上听新闻,有趣还有料!\\\对于即将到来的Visual Studio 2017 15.7,微软已经发布了多个新的预览版本。这些版本的变更很有限,似…

python库引用的3种方式比较
方法一 import 库名 使用方式: <库名>.<函数名>(<函数参数>) 方法二 from 库名 import 函数名/* 使用方式: <函数名>(<函数参数>) 第一种方法可以避免第三方库函数和自定义函数重名 第二种更简洁,适用于引用…

使用livereload实现自动刷新
livereload是一个web开发辅助工具,当我们修改完html、css和js的时候会自动刷新浏览器,解放码农的双手。这样在双屏切图、写js代码的时候会提高很多效率。livereload有很多版本,比如基于ruby的版本,我们今天介绍的是nodegruntchrom…

Task03:青少年软件编程(Scratch)等级考试模拟卷(二级)
电子学会 软件编程(图形化)二级训练营 试题来源 青少年软件编程(Scratch)等级考试试卷(二级)【2019.09】青少年软件编程(Scratch)等级考试试卷(二级)【2019…

java静态代理与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式。其目的是为其他对象提供一个代理以控制对某个真实对象的访问。通过代理类这一中间层,有效控制对真实委托类的对象的直接访问,同时可以实现自定义的控制策略。 根据…

python的turtle绘图体系入门必看(二)
1 turtle画笔控制函数 画笔操作后一直有效,一般成对出现 turtle.penup() 别名 turtle.pu() 画笔抬起,海龟在飞行(不在画布上留下图案) turtle.pendown() 别名 turtle.pd() 画笔落下,海龟在爬行 turtle.pensize(width) 别名 turtle.width(wi…

MSSQL2005外网IP的1433端口开启方法
打开SQL Server Configuration Manager,在SQL server配置管理器展开SQL server 2005网络配置-->SQLEXPRESS 的协议-->双击TCP/IP协议-->ip地址将1433端口启用,重启下MSSQL服务才能生效,示例图: 重启下MSSQL服务才能生效转…

Rokid webhook 指南 手把手教你做个懒人
若琪用户 Amadeus 在社区里分享过很多视频。当你进门10秒后还未关闭房门,若琪会一直报警提醒;当你走进门后将门反锁的那一刻,若琪会为你播报今天的天气、为你播放设定的轻音乐。 看到这些视频中对传感器、智能情景的熟练运用,你很…

Task04:青少年软件编程(Scratch)等级考试模拟卷(二级)
电子学会 软件编程(图形化)二级训练营 试题来源 青少年软件编程(Scratch)等级考试试卷(二级)【2019.09】青少年软件编程(Scratch)等级考试试卷(二级)【2019…

Python数字类型及操作汇总(入门级)
1. 整数类型 2. 浮点数类型 带有小数点及小数的数字 取值范围和精度都有限制,但常规计算可忽略不计(基本无限制) 注意:浮点数运算存在不确定尾数(不是bug,一般发生在10-16左右,因为计算机内部用二进制表示,…

FCKeditor如何升级CKEditor及使用方法
之前编辑器用的是FCKeditor,因为项目原因需要升级为最新版本4.2.2,发现是已经更名为CKEditor。 百度了一下,据官方的解释,CK是对FCK的代码的完全重写。 项目环境是asp.net的,之前用的FCKeditor版本是2.6。 在aspx文件头…

【新周报(045)】青少年编程竞赛交流群周报
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。 为了完成二月份青少年编程公益训练营的活动,本周整理了以往收集的电…

Xshell5中常用linux服务器命令集合
简易版:http://www.zhimengzhe.com/linux/84546.html 详细版:http://www.cnblogs.com/peida/tag/%E6%AF%8F%E6%97%A5%E4%B8%80linux%E5%91%BD%E4%BB%A4/default.html?page4转载于:https://www.cnblogs.com/keye/p/8982440.html

C++设置每屏显示的行数简易办法
定义计数变量counter if ((counter) % 22 0) { //每屏显示22行 cout << "请按回车键继续";cin.get(); }效果

挖坑挖到cnblogs.com来...
这几年一直在cppblog.com上敲字, 因为开帖时满脑袋都是C, 所以选了它~ 懒懒散散竟然也敲了四年多, 真是难得的有毅力啊~ 回头看看这一年越来越不务正业了,C越来越少, 到是当年看着不爽的Java越来越多~唉, 语言只是工具而已, 当年为何如此偏执~ 本来就想在cppblog.co…

vue项目踩坑
由于上一个小项目写的很次,这一次打算好好地写一个博客系统,最近刚刚结束了管理员的管理端的编写。其中遇到了很多小坑。 其实只能说自己vue用的不是特别熟练吧。很多问题都有些想当然了,实现起来发现了很多的问题。简单的记录几个我自己认为…