Оператор C++ () и объявление "using": левый операнд должен быть ошибкой l-значения
приведенный ниже пример иллюстрирует более сложную, но не несхожую проблему, которую я пытался решить элегантно. У меня есть набор шаблонов, которые должны быть специализированными и при этом реализовывать один или оба интерфейса: читаемый и доступный для записи, в каждой специализации. Specific реализует оба интерфейса, а затем тестируется с помощью 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 ответов
это ошибка компилятора: объявление using должно работать. Чтобы обойти проблему, просто используйте делегирование:
class Writable: public Readable {
...
int operator()(int i) const { return Readable::operator()(i); }
...
};
эта реализация длиннее, чем реализация, фактически делегированная, но она позволяет избежать проблем, если версия в Readable
никогда не меняется.