出现 parentheses were disambiguated as a function declaration 警告的原因

原因和解决方案

原因:C语言允许在定义变量时添加多余的括号,这使得在某些情况下当你想调用构造函数时,编译器无法分清你是在调用构造函数还是在定义变量(即int(a)可被编译器理解为int a
解决方案:

  1. 使用强制类型转换
  2. 使用{}代替()调用构造函数 (C++11)

举例说明

#include <iostream>

using namespace std;

struct Dog
{
    Dog(const string &name) { this->name = name; }
    string name;
};

struct DogOwner
{
    DogOwner(const Dog &dog) { this->dog = new Dog{dog}; }
    Dog *dog;
};

int main()
{
    string dogName = "momiji";
    DogOwner aya(Dog(dogName)); //该行会报警
}

原因分析

由于C语言允许在定义变量时添加多余的括号,所以
DogOwner aya(Dog(dogName));
也可被编译器理解为:
DogOwner aya(Dog dogName);
编译器无法分清该行是要调用构造函数还是定义变量,从而导致出现 parentheses were disambiguated as a function declaration 警告

解决方案

1.使用强制类型转换
DogOwner aya((Dog)dogName);

2.使用{}调用构造函数
DogOwner aya(Dog{dogName});

参考链接:
[1]: https://zh.wikipedia.org/wiki/%E6%9C%80%E4%BB%A4%E4%BA%BA%E7%83%A6%E6%81%BC%E7%9A%84%E8%A7%A3%E6%9E%90 “最令人烦恼的解析”

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值