【问题标题】:error: address of overloaded function with no contextual type information错误:没有上下文类型信息的重载函数的地址
【发布时间】:2011-08-19 11:57:33
【问题描述】:

代码:

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;
}

我想将第 2 行替换为第 3 行(“?:”的“if”语句)。
如果我取消注释 3,编译器会给我一个错误。
如果我删除第 1 行,则第 3 行有效。
问题是:编译器想从我这里得到什么
错误:错误:没有上下文类型信息的重载函数地址
编译器:gcc-4.5.2

【问题讨论】:

  • 这里为什么需要使用函数指针?为什么不反复拨打operator++

标签: c++ operator-overloading


【解决方案1】:

错误:没有上下文类型信息的重载函数地址

operator++ 名称的函数有两个(即消息的“重载函数”位),您需要指定您想要的一个(即“上下文类型信息”之一):

n > 0 ? (que& (que::*)())&que::operator++ : 0

您必须考虑到上述子表达式独立于封闭的完整表达式,即对go 的赋值。所以它本身必须是正确的,即它不能使用 go 的类型来选择正确的重载,因为它不是这个特定子表达式的一部分。

【讨论】:

  • 我认为它可以从“go”声明中获取此信息。
猜你喜欢
  • 1970-01-01
  • 2019-08-16
  • 2021-10-02
  • 2012-03-07
  • 1970-01-01
  • 2017-06-22
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多