Почему приведенный ниже код недействителен (по крайней мере, с использованием Visual Studio 2010 или ideone)?
// E.h
enum E
{
AN_E_VALUE
};
// C.h
class C
{
public:
explicit C(E e) // explicit keyword is optional
{}
void Foo() {}
};
// main.cpp
int main(int argc, char** argv)
{
C c(AN_E_VALUE); // fine
C(AN_E_VALUE); // error
C(AN_E_VALUE).Foo(); // fine
return 0;
}
Если параметр не является перечисляемым типом, он работает нормально.
Компилятор понимает ошибочный вызов как вызов с 0 аргументами, где ожидается 1. Почему это?
C(AN_E_VALUE);
Это объявляет объект типа C
с именем AN_E_VALUE
, Ошибка жалуется на тот факт, что вам нужен конструктор по умолчанию для инициализации AN_E_VALUE
, но конструктора по умолчанию не существует (и ни один не объявлен неявно).
Вы когда-нибудь пробовали это?
int(a);
По сути, это то же самое. Возможно проверить этот вопрос.