Вы должны предоставить конструктор по умолчанию.Пока вы работаете над этим, исправьте и другой конструктор:
class Name
{
public:
Name() { }
Name(string const & f, string const & l) : first(f), last(l) { }
//...
};
В качестве альтернативы вы должны предоставить инициализаторы:
Name arr[3] { { "John", "Doe" }, { "Jane", "Smith" }, { "", "" } };
Последний концептуально предпочтителен, поскольку нетПричина, по которой ваш класс должен иметь представление о состоянии "по умолчанию".В этом случае вы просто имеете , чтобы обеспечить соответствующий инициализатор для каждого элемента массива.
Объекты в C ++ никогда не могут находиться в плохо определенном состоянии;если вы думаете об этом, все должно стать очень ясным.
Альтернативой является использование динамического контейнера, хотя это отличается от того, что вы просили:
std::vector<Name> arr;
arr.reserve(3); // morally "an uninitialized array", though it really isn't
arr.emplace_back("John", "Doe");
arr.emplace_back("Jane", "Smith");
arr.emplace_back("", "");
std::vector<Name> brr { { "ab", "cd" }, { "de", "fg" } }; // yet another way