C++ Most vexing parse

原文C++最令人烦恼的解析

问题描述

假如有如下示例:

//类Timer
class Timer{
public:
    Timer(){ cout << "Timer()"<<endl; }
}
//类TimeKeeper
class TimeKeeper{
public:
    TimeKeeper(const Timer& t)
    { 
        cout << "TimeKeeper()"<<endl; 
    }
}
int main(){
    TimeKeeper timekeeper( Timer() );
    return 0;
}

对于main函数里的调用:TimeKeeper timekeeper( Timer() ),我们会认为是声明一个Timekeeper类型的变量,使用一个Timer类型的对象引用来初始化。
但实际上在运行的时候编译器报出如下警告
警告
而运行结果也不是预期的输出
运行结果
编译器认为我们声明了一个timekeeper函数,该函数的参数是指向返回类型Timer(并且不输入)的函数的指针,并且返回一个Timekeeper类型的对象。


解决方法

  1. 可以在参数的外面多加一个括号TimeKeeper timekeeper( ( Timer() ) ),强制使编译器把timekeeper视为一个变量;
  2. 使用C++11引入的新特性,使用大括号作为统一初始化语法TimeKeeper timekeeper{ Timer() }; 同样可以解决问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值