C++运算符 () 和'using'声明:左操作数必须是 l 值错误

C++ Operator () and 'using' Declaration: Left operand must be l-value error

本文关键字:操作数 错误 声明 运算符 C++ using      更新时间:2023-10-16

下面的例子说明了我一直试图优雅地解决的一个更复杂但并非不同的问题。我有一组必须专门化的模板,在这样做的过程中,在每个专门化中实现两个接口中的一个或两个:Readable和Writable。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;
}

上面的代码在VS20082010上失败,原因如下:

错误C2106:"=":左操作数必须是l-value。

这让我觉得很奇怪:我忽略了一些简单的事情吗?我使用[]运算符编译并运行了这段代码,一切都很好(应该而且一直如此)。这似乎是一个与该操作员的行为有关的问题,我对此并不熟悉。

这是一个编译器错误:using声明应该有效。要解决这个问题,只需使用委派:

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

此实现比实际委托的实现要长,但如果Readable中的版本发生更改,则可以避免出现问题。