【发布时间】: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