这是今天遇到的一个问题。
背景知识 :Wt::Dbo中大量运用了C++模板。
在 本座正在做的这 个项目中, 某个部分需要 对用户的“余额” 做一个扣除动作。 本座是直接按照Wt教程里的示例来写的, 不过 有个细节没注意搞好 ,导致了今天这个问题 。具体实行扣除动作的就是这一句话:
joe.modify()-> CashCredit -= RlPrcAmt; //扣除现金券。
其中 ,joe是一个 : dbo :: ptr < ManagedUser > joe ,表示将要对其进行扣除余额动作的用户 。 RlPrcAmt是一个 int ,表示 将要扣除的余额数量 ,在运行时 是一个非0的值,这个已经通过调试确认了 。
而 M anagedUser是一个数据库对象 类 :
class ManagedUser
{
public :
enum RoleEnum
{
Admin = 1 , //!<管理员。
NormalUser = 2 //!<普通用户。
}; //enum RoleEnum
RoleEnum Role ; //!<身份。
WString name ;
string password ; //!<密码的MD5.
WString phone ;
int verified ;
int id ; //!<编号。
int proxylevel ; //!<代理商级别。
int gender ; //!<性别。
WString postaladdress ; //!<邮寄地址。
WString recommendor ; //!<推荐人。
dbo :: collection < dbo :: ptr < MoneyFlow > > PayerFlows ; //!<作为支出者的交易流集合。
dbo :: collection < dbo :: ptr < MoneyFlow > > ReceiverFlows ; //!<作为收入者的交易流集合。
float CashCredit ; //!<现金券余额。
string loginname ; //!<登录名。
注意 看其中的CashCredit成员, 它是一个 float ,表示该用户当前拥有的余额。
本座在测试过程中,发现 这一句扣除余额数量的代码所在 的事务并没有成功提交 (或者 是 CashCredit的值根本没改变 ,导致提交成功也没有变化 ) ,也没有看到 Wt::Dbo 给出 任何错误提示。
直觉猜测 是 CashCredit成员与RlPrcAmt变量之间的数据类型不一致引起这句自减操作失败 ,一个是 float ,一个是 int 。因为模板 这种机制 本身 就是 对 数据类型 做手脚 的嘛 , 可能编译生成 的代码中 不知道这种类型 不一致的减法运算怎么处理呢。
于是 把RlPrcAmt的类型改成 float ,与CashCredit成员保持一致,果然就正常地扣除余额数量了 。
并不 了解其中的根本 原 理 ,只待日后充分了解了模板再来研究吧 。
未知美女
安以轩
HxLauncher: Launch Android applications by voice commands