нет перечисления типа в C ++ перечислении - PullRequest
1 голос
/ 06 апреля 2020

У меня есть это объявление класса "отношений", для которого требуется инициализировать значение "отношение_лабели".

namespace hr {
    class node;

    enum relation_label : uint8_t {
        HAS, CONTAINS, IS_PARALLEL, INCLUDES, IS, PART_OF, LEADS_TO, IN
    };


    template<typename N>
    class relation : public std::vector<N> {
    private:
        relation(const relation &) = default;

    public:
        const relation_label label;

        relation(relation_label l) : std::vector<N>(0) {
            this->label = l;
        };
    };
}

Этот код компилируется, но создание новых экземпляров объектов отношений не компилируется. Например, ошибка на:

relation<word *> includes(relation_label::INCLUDES);

: «Нет типа с именем« ВКЛЮЧЕНО »в« hr :: ratio_label »».

Есть идеи? Большое спасибо.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Ошибка, которую вы видите, может быть вызвана еще одной ошибкой до этого, а именно:

const члены должны быть инициализированы в строке или с member-init-list. В теле конструктора они уже const.

Изменить

    relation(relation_label l) : std::vector<N>(0) {
        this->label = l;
    };

На

    relation(relation_label l) : std::vector<N>(0), label(l) {
    }

Кроме того, я надеюсь, word - это определенный тип где-то в вашем приложении.


=== РЕДАКТИРОВАТЬ ===

Из комментария:

"слово" это определяется следующим образом:

class word;
class word_related : public named_node {
public: relation<word*> includes(relation_label::INCLUDES);
};

Что означает relation<word*> includes(relation_label::INCLUDES)? Это похоже на определение функции-члена includes(), но тогда relation_label::INCLUDES должен быть типом. Что это не так, очевидно.

Может быть, вы имели в виду

relation<word*> includes(relation_label lbl = relation_label::INCLUDES);

?

0 голосов
/ 07 апреля 2020

Поскольку вы пытаетесь создать новый экземпляр объекта отношения в строке, приводящей к ошибке компиляции, попробуйте вместо этого использовать скобку-инициализацию

relation<word*> includes{relation_label::INCLUDES};

. При компиляции вашего предыдущего кода

class word_related : public named_node {
public: relation<word*> includes(relation_label::INCLUDES);
};

компилятор думает, что вы собираетесь объявить функцию-член includes класса named_node (и поэтому он ожидает тип параметра функции вместо 'value') вместо определения инициализированной по умолчанию переменной-члена.

Этот ответ является дополнением к ответу rustyx, в котором рассматривается наиболее важный момент пропущенной инициализации переменной-члена const.

Код можно найти здесь , с исправлением из ответа ржавчины.

...