2

我无法使用对象 a3 调用“显式 a(字符串 x)”,出现两个编译错误,例如:

[错误] 从 'const char*' 到 'int' 的无效转换 [-fpermissive]

[错误] 初始化 'a::a(int)' 的参数 1 [-fpermissive]

我的预期输出是'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
}
4

2 回答 2

3

在语法上,C++ 解释

a a3 = ("Widf");

作为“评估表达式"Widf",然后构造一个a名为的类型的对象,该对象a3被初始化为等于它。” 由于"Widf"有 type ,C++ 只有在有可用的隐式转换构造函数时const char[4]才能初始化。由于您已明确标记了构造函数,因此此隐式转换不可用,因此出现错误。a3"Widf"explicit

要解决此问题,请尝试将行重写为

a a3("Widf");

这不会"Widf"首先尝试评估,而是直接将其作为参数传递给构造函数。

希望这可以帮助!

于 2013-02-24T07:17:48.400 回答
2

必须通过结构/类名调用显式构造函数:

a("Widf")

使用相等作为构造函数不是显式的构造函数调用。你可以使用这个:

a a3 = a("Widf")

这将:

  1. 创建一个临时对象 a
  2. 使用复制构造函数创建 a3

编译器优化器应该能够对此进行优化。

或者,您可以只写

a a3("Widf")
于 2013-02-24T07:18:59.113 回答