all*_*all 2 c++ operator-overloading
码:
class que {
public:
que operator++(int) {} // 1
que &operator++() {}
que &operator+=(int n) {
que& (que::*go)();
go = 0; if(n > 0) go = &que::operator++ ; // 2
//go = (n > 0) ? (&que::operator++) : 0 ; // 3
}
};
int main() {
que iter;
iter += 3;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想用第3行替换第2行("if:"语句为"?:").
如果我取消注释3,编译器会给我一个错误.
如果我删除第1行,则第3行有效.
问题是:编译器对我有什么要求?
错误:错误:没有上下文类型信息的重载函数的地址
编译器:gcc-4.5.2
错误:没有上下文类型信息的重载函数的地址
名称有两个函数operator++(即消息的'重载函数'位),您需要指定所需的函数(即'上下文类型信息'):
n > 0 ? (que& (que::*)())&que::operator++ : 0
Run Code Online (Sandbox Code Playgroud)
您必须考虑上面的子表达式独立于封闭的完整表达式,赋值为go.因此它必须是正确的,即它不能使用类型go来选择正确的重载,因为它不是这个特定子表达式的一部分.