Где здесь ошибка?

380
24 апреля 2017, 04:57

Пожалуйста помогите найти мою ошибку.

Почему компилятор ругается?

struct memb{
    int nomer;
    string score;
 memb(int nomer = 0, string score) : nomer(nomer), score(score) {};

 }*cis;

24|error: default argument missing for parameter 2 of ‘memb::memb(int, std::__cxx11::string)’|

Answer 1

Параметр(ы) со значением по умолчанию должен(ы) быть последним(и). У вас же после параметра со значением по умолчанию идет обычный параметр.

Если так хочется - сделайте

memb(string score, int nomer = 0) : nomer(nomer), score(score) {};
Answer 2

Данное объявление

struct memb{
    int nomer;
    string score;
 memb(int nomer = 0, string score) : nomer(nomer), score(score) {};

 }*cis;

Имело бы смысл, если бы в C++ был разрешен такой вызов функций, как

memb( , "Hello" );
     ^^^

Однако такой вызов в C++ является синтаксической ошибкой. То есть вы не можете пропускать выражения аргументов при вызове функции. Можно пропускать значения выражений аргументов функций только в конце списка аргументов при условии, что пропущенным аргументам соответствуют аргументы по умолчанию.

Вы могли бы определить конструкторы данной структуры следующим образом

Данное объявление

struct memb{
    int nomer;
    string score;
 memb( const string &score) : nomer(0), score(score) {};
 memb(int nomer, const string &score) : nomer(nomer), score(score) {};

 }*cis;

Либо вы могли бы использовать делегирующий конструктор. Например,

struct memb{
    int nomer;
    string score;
 memb( const string &score) : memb( 0, score ) {};
 memb(int nomer, const string &score) : nomer(nomer), score(score) {};

 }*cis;

Обратите внимание, что параметр, который соответствует объекту типа std::string лучше объявить как константную ссылку на объект. В этому случае вы можете также в качестве аргумента использовать строковые литералы. Например,

memb( "Hello World!" );

Выражение со строковым литералом неявно преобразуется во временный объект типа std::string и константная ссылка на этот объект будет передана конструктору.

Также, возможно вам понадобится конструктор по умолчанию, если вы собираетесь создавать массивы элементов данной структуры.

Например,

struct memb{
    int nomer;
    string score;
 memb() : nomer(0) {};
 memb( const string &score) : nomer(0), score(score) {};
 memb(int nomer, const string &score) : nomer(nomer), score(score) {};

 }*cis;

Если создаваемый массив небольшой, то вы можете инициализировать каждый элемент массива при вызове оператора new. Например,

#include <iostream>
#include <string>
struct memb
{
    int nomer;
    std::string score;
    memb() : nomer(0) {}
    memb( const std::string &score) : nomer(0), score(score) {}
    memb( int nomer, const std::string &score ) : nomer(nomer), score(score) {}
} *cis = new memb[2] { { 1, "A" }, { 2, "B" } };
int main() 
{
    return 0;
}

Иначе вам придется создавать элементы массива, используя конструктор по умолчанию, а затем присваивать требуемые значения членам данных каждого элемента массива.

Вы упростите себе жизнь, если вместо вручную выделять массив будете ипользлвать стандартный класс std::vector<memb>.

READ ALSO
C++ iterator для своего контейнера

C++ iterator для своего контейнера

Здравствуйте! Я написал свой класс-контейнерИ теперь мне нужно написать класс iterator, чтобы мой контейнер смог взаимодействовать с алгоритмами...

359
Структуры с++ Visual Studio

Структуры с++ Visual Studio

Создал стуктуруВвожу 2 элемента f

278
Проблема с CLion, Makefile

Проблема с CLion, Makefile

При попытки собрать проект, я поучаю следующую ошибку

577
Ускорение обработки изображений OpenCV

Ускорение обработки изображений OpenCV

История такаяВ программе понадобился урезанный редактор для изображений, в котором есть ползунки, меняющие значение для гаммы, контраста...

429