Почему я не могу вызвать ‘явный (строка x)’?

Я не могу вызвать ‘явный (строка x)’, используя объект a3, я получил две ошибки компиляции, такие как:

[Ошибка] неверное преобразование из ‘const char *’ в ‘int’ [-fpermissive]

[Ошибка] инициализация аргумента 1 ‘a :: a (int)’ [-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
}

2

Решение

Явный конструктор должен вызываться через имя структуры / класса:

a("Widf")

Использование равенства в качестве конструктора не является явным вызовом конструктора.
Вы можете использовать это:

a a3 = a("Widf")

Который будет:

  1. Создать временный объект
  2. Используйте конструктор копирования для создания a3

оптимизатор компилятора должен быть в состоянии оптимизировать это все же.

Кроме того, вы можете просто написать

a a3("Widf")
2

Другие решения

Синтаксически C ++ интерпретирует

a a3 = ("Widf");

Как оценить выражение "Widf", а затем построить объект типа a называется a3 что инициализируется, чтобы быть равным ему «. Так как "Widf" имеет тип const char[4], C ++ сможет только инициализировать a3 в "Widf" если имеется неявный конструктор преобразования. Поскольку вы явно пометили конструктор explicitЭто неявное преобразование недоступно, следовательно, ошибка.

Чтобы это исправить, попробуйте переписать строку как

a a3("Widf");

Это не пытается оценить "Widf" сначала, но вместо этого непосредственно передает его в качестве параметра конструктору.

Надеюсь это поможет!

3

По вопросам рекламы [email protected]