Я не могу вызвать ‘явный (строка 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
}
Явный конструктор должен вызываться через имя структуры / класса:
a("Widf")
Использование равенства в качестве конструктора не является явным вызовом конструктора.
Вы можете использовать это:
a a3 = a("Widf")
Который будет:
оптимизатор компилятора должен быть в состоянии оптимизировать это все же.
Кроме того, вы можете просто написать
a a3("Widf")
Синтаксически C ++ интерпретирует
a a3 = ("Widf");
Как оценить выражение "Widf"
, а затем построить объект типа a
называется a3
что инициализируется, чтобы быть равным ему «. Так как "Widf"
имеет тип const char[4]
, C ++ сможет только инициализировать a3
в "Widf"
если имеется неявный конструктор преобразования. Поскольку вы явно пометили конструктор explicit
Это неявное преобразование недоступно, следовательно, ошибка.
Чтобы это исправить, попробуйте переписать строку как
a a3("Widf");
Это не пытается оценить "Widf"
сначала, но вместо этого непосредственно передает его в качестве параметра конструктору.
Надеюсь это поможет!