我无法使用对象a3调用'显式a(字符串x)',我收到两个编译错误,例如:
[错误]从'const char *'无效转换为'int'[-fpermissive]
[错误]初始化'a :: a(int)'[-fpermissive]
的参数1
我的预期输出是'int int double string';
有人可以帮我删除这些错误吗?谢谢你有价值的时间。
#include<iostream>
#include<string.h>
using namespace std;
struct a{
a(int x=0){cout<<" int ";
}
inline a (double x){cout<<" double ";
}
explicit a (string x){ cout<<" string ";
}
};
int main()
{
a a0(NULL);
a a1=9;
a a2=1.1;
a a3=("Widf"); //Error
}
答案 0 :(得分:3)
从语法上讲,C ++解释
a a3 = ("Widf");
作为“评估表达式"Widf"
,然后构造一个名为a
的{{1}}类型的对象,该对象被初始化为等于它。”由于a3
的类型为"Widf"
,因此如果存在可用的隐式转换构造函数,则C ++只能将const char[4]
初始化为a3
。由于您已明确标记了构造函数"Widf"
,因此此隐式转换不可用,因此错误。
要解决此问题,请尝试将该行重写为
explicit
这不首先尝试评估a a3("Widf");
,而是直接将其作为参数传递给构造函数。
希望这有帮助!
答案 1 :(得分:2)
必须通过结构/类名调用显式构造函数:
a("Widf")
使用相等作为构造函数不是显式构造函数调用。 你可以用这个:
a a3 = a("Widf")
将会:
编译器优化器应该能够对此进行优化。
或者,你可以写
a a3("Widf")