为什么我无法调用'explicit a(string x)'?

时间:2013-02-24 07:12:47

标签: c++ casting constructor explicit

我无法使用对象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
}

2 个答案:

答案 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")

将会:

  1. 创建临时对象
  2. 使用复制构造函数创建a3
  3. 编译器优化器应该能够对此进行优化。

    或者,你可以写

    a a3("Widf")