C++运算符 () 和'using'声明:左操作数必须是 l 值错误
C++ Operator () and 'using' Declaration: Left operand must be l-value error
下面的例子说明了我一直试图优雅地解决的一个更复杂但并非不同的问题。我有一组必须专门化的模板,在这样做的过程中,在每个专门化中实现两个接口中的一个或两个: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
中的版本发生更改,则可以避免出现问题。
相关文章:
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 错误:二进制'operator*' 'float'和'float[0]'类型的操作数无效
- 错误 C2679 二进制"<<":未找到采用类型为 'T' 的右侧操作数的运算符
- 错误:'operator>'不匹配(操作数类型为 'Student' 和 'Student'
- 如何摆脱逗号运算符的这个错误右操作数没有效果( wunsued 值)?
- c++ 错误:二进制"运算符+"类型"矩阵*"和"矩阵*"的操作数无效
- 使用堆栈编译错误的 C++ 反向行没有运算符匹配操作数
- 当我尝试构建此程序时,出现此错误:需要左键作为赋值的左操作数
- 错误:二进制">>":未找到采用类型为"const char [1] 的右操作数的运算符
- C++ 重载:[错误] 与'operator='不匹配(操作数类型为 'String' 和"字符串")
- 错误 C2679:二进制'<<':找不到采用类型 'overloaded-function' 的右侧操作数的运算符(或者没有可接受的转换)
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- C++ 运算符不匹配操作数错误
- c++的cout操作数错误,类型错误
- 使用cin时,字符串上的右操作数错误
- OpenCV无效操作数错误
- 需要lvalue作为增量操作数错误
- C++无效操作数错误
- c++模板类冒泡排序操作数错误