【问题标题】:C++ Operator () and 'using' Declaration: Left operand must be l-value errorC++ 运算符 () 和 'using' 声明:左操作数必须是左值错误
【发布时间】:2012-01-04 03:43:18
【问题描述】:

下面的示例说明了我一直试图优雅地解决的一个更复杂但相似的问题。我有一组必须专门化的模板,并且在这样做时,在每个专门化中实现两个接口中的一个或两个:可读和可写。具体实现了这两个接口,然后使用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:“=”:左操作数必须是左值。

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

【问题讨论】:

  • 在 GCC 中编译良好,猜测是 MSVC 错误。
  • 我编辑了我的原始帖子,因为我的问题的性质有些混乱(毫无疑问,我在疯狂编辑时有错)。
  • 你是否得到与int& i = specific(0); i = 1;相同的错误
  • @abelenky 一个operator()const。另一个不是。 virtual 在这种情况下不会做任何事情。
  • 如果你说specific.operator()(0) = 1; 怎么办?

标签: c++ inheritance operator-overloading


【解决方案1】:

这是一个编译器错误:using 声明应该可以工作。要解决此问题,只需使用委托:

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

这个实现比实际委派给的实现要长,但它可以避免Readable 中的版本发生变化时出现问题。

【讨论】:

  • 感谢 Dietmar,这是我自己完成的,并且似乎是最优雅的工作。不过,这仍然是一件令人头疼的事情,并且在编译器中似乎是一个小问题(与其他问题相比)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多