комбинация volatile + объект запрещена в C ++? - PullRequest
4 голосов
/ 20 сентября 2010

Я использую встроенный компилятор для TI TMS320F28335, поэтому я не уверен, является ли это общей проблемой C ++ (у меня под рукой нет компилятора C ++) или просто моим компилятором. Добавление следующего фрагмента кода в мой код приводит к ошибке компиляции:

"build\main.cpp", line 61: error #317: the object has cv-qualifiers that are not
compatible with the member function
        object type is: volatile Foo::Bar

Ошибка исчезает, когда я комментирую функцию initWontWork() ниже. Что говорит мне ошибка, и как я могу ее обойти, не прибегая к использованию static функций, которые работают на volatile struct?

struct Foo
{
    struct Bar
    {
        int x;
        void reset() { x = 0; }
        static void doReset(volatile Bar& bar) { bar.x = 0; } 
    } bar;
    volatile Bar& getBar() { return bar; }
    //void initWontWork() { getBar().reset(); }
    void init() { Bar::doReset(getBar()); } 
} foo;

1 Ответ

11 голосов
/ 20 сентября 2010

Таким же образом вы не можете сделать это:

struct foo
{
    void bar();
};

const foo f;
f.bar(); // error, non-const function with const object

Вы не можете сделать это:

struct baz
{
    void qax();
};

volatile baz g;
g.qax(); // error, non-volatile function with volatile object

Вы должны квалифицировать cv:

struct foo
{
    void bar() const;
};

struct baz
{
    void qax() volatile;
};

const foo f;
f.bar(); // okay

volatile baz g;
g.qax(); // okay

Итак, для вас:

void reset() volatile { x = 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...