Почему нормально передавать перечисление как переменную функции, а не возвращать перечисление? - PullRequest
1 голос
/ 23 декабря 2011

Я немного запутался с ошибкой, которая у меня сейчас есть. У меня есть получатель / установщик в моем классе. Установщик принимает перечисление в качестве параметра, и получатель должен возвращать это перечисление. Однако я получаю эту ошибку для получателя:

ошибка: C2143: синтаксическая ошибка: отсутствует ';' до 'Session :: type'

как если бы SessionType не было определено. Однако я не получаю ту же ошибку для сеттера. Есть ли причина, почему? И есть ли способ исправить эту ошибку?

(кстати, он прекрасно компилируется, если я возвращаю int, но я бы предпочел, чтобы метод получения соответствовал параметру)

Вот мой код:

Session.h

class Session {

public:

    enum SessionType {
        FreeStyle,
        TypeIn,
        MCQ
    };

    explicit Session();
    SessionType type() const;
    void setType(SessionType v);

private:

    SessionType type_;

}

Session.cpp:

SessionType Session::type() const { // ERROR!!
    return type_;
}

void Session::setType(SessionType v) { // No error?
    if (type_ == v) return;
    type_ = v;
}

Ответы [ 3 ]

7 голосов
/ 23 декабря 2011

Изменить

SessionType Session::type() const { // ERROR!!

на

Session::SessionType Session::type() const {
4 голосов
/ 23 декабря 2011

Проблема в том, что при определении функции в Session.cpp во время оценки возвращаемого типа компилятор еще не совсем осознает, что это функция-член класса, и неиметь это перечисление в области видимости.Это связано с определением функции слева направо.Попробуйте это

Session::SessionType Session::type() const { // ERROR!!
    return type_;
}

Обратите внимание, что другой случай сработал, потому что он не встречает перечисление до тех пор, пока не будет оценено имя функции, и, следовательно, имеет перечисление в области.вы получаете из-за отсутствия точки с запятой в конце определения класса.

3 голосов
/ 23 декабря 2011

Вы забыли закрыть объявление класса:

class Session {

public:

    enum SessionType {
        FreeStyle,
        TypeIn,
        MCQ
    };

    explicit Session();
    SessionType type() const;
    void setType(SessionType v);

private:

    SessionType type_;

}; // <- semicolon here

, и вам необходимо указать имя enum вне класса:

Session::SessionType
...