代码:
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;
}
我想用第3行替换第2行(“if:”的语句为“?:”)
如果我取消注释3,编译器会给我一个错误
如果删除第1行,则第3行起作用
问题是:编译器想要什么?
错误:错误:没有上下文类型信息的重载函数的地址
编译:gcc-4.5.2
答案 0 :(得分:6)
错误:没有上下文类型信息的重载函数的地址
operator++
名称有两个函数(即消息的'重载函数'位),您需要指定所需的函数(即'上下文类型信息'):
n > 0 ? (que& (que::*)())&que::operator++ : 0
您必须考虑上述子表达式与封闭的完整表达式(go
的赋值)无关。所以它必须是正确的,即它不能使用go
的类型来选择正确的重载,因为它不是这个特定子表达式的一部分。