Пример ниже иллюстрирует более сложную, но не похожую проблему, которую я пытался элегантно решить.У меня есть набор шаблонов, которые должны быть специализированными, и при этом реализовать один или оба из двух интерфейсов: 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.
Мне кажется странным: я что-то упустил из виду?Я скомпилировал и запустил именно этот код, используя оператор [], и все было хорошо (как и должно было быть).Может показаться, что это проблема, связанная с поведением этого оператора, с которой я не знаком.