Оператор C ++ () и объявление «using»: левый операнд должен содержать ошибку l-значения - PullRequest
8 голосов
/ 04 января 2012

Пример ниже иллюстрирует более сложную, но не похожую проблему, которую я пытался элегантно решить.У меня есть набор шаблонов, которые должны быть специализированными, и при этом реализовать один или оба из двух интерфейсов: Readable и Writable, в каждой специализации.Конкретно реализует оба интерфейса, а затем тестируется с использованием main:

class Readable
{
protected:

    int values[3];

public:

    Readable()
    {
        // Does nothing.
    }

    int operator()(int i) const
    {
        return values[i];
    }
};

class Writable : public Readable
{
public:

    Writable()
    {
        // Does nothing.
    }

    using Readable::operator ();
    int& operator()(int i)
    {
        return values[i];
    }
};

class Specific : public Writable
{
};

void write_test(Specific& specific)
{
    // Error C2106: '=' : left operand must be l-value
    specific(0) = 1;
}

int main()
{
    Specific s;
    write_test(s);

    return 0;
}

Приведенный выше код не работает на VS 2008, 2010 со следующим:

ошибка C2106: '='левый операнд должен иметь значение l.

Мне кажется странным: я что-то упустил из виду?Я скомпилировал и запустил именно этот код, используя оператор [], и все было хорошо (как и должно было быть).Может показаться, что это проблема, связанная с поведением этого оператора, с которой я не знаком.

1 Ответ

5 голосов
/ 04 января 2012

Это ошибка компилятора: должно использоваться объявление using.Чтобы обойти проблему, просто используйте делегирование:

class Writable: public Readable {
    ...
    int operator()(int i) const { return Readable::operator()(i); }
    ...
};

Эта реализация длиннее, чем фактически делегированная реализация, но избегает проблем, если версия в Readable когда-либо изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...