【问题标题】:const function and referencesconst 函数和引用
【发布时间】:2013-10-25 05:47:39
【问题描述】:

如果您在以下函数中注意到它们都有相同的用于搜索整数位置的 for 循环。 Pop() 编译但我得到一个错误,因为 top() 与 const 限定符有关。堆类继承自 eecs281heap,它存储了一个函子 Comp 比较,其中 Comp 是类型名。讲师告诉我们访问函子的唯一方法是通过 this->() 所以我只是在这里寻找一些指导。谢谢

错误:将“const large”作为“bool large::operator()(int, int)”的“this”参数传递会丢弃限定符

在 int main 中运行以下命令后会发生这种情况。通过测试我已经知道构造函数可以正常工作。

vector <int> data={10,2,13};
poorman_heap<int,larger> y(data.begin(),data.end());

template<typename TYPE, typename COMP>
void poorman_heap<TYPE, COMP>::pop() {
    int location=0;
    for(int i=1;i<data.size();i++){
        if(this->compare(data.at(i),data.at(location))){
            location=i;
        }
    }
    data.erase(data.begin()+location);
    return;
}

template<typename TYPE, typename COMP>
const TYPE& poorman_heap<TYPE, COMP>::top() const {
    int location=0;
    for(int i=1;i<data.size();i++){
        if(this->compare(data.at(i),data.at(location))){
            location=i;
        }
    }
    return data.at(location); 
}

附:更大的是

struct greater{
    bool operator()(int x,int y){
        return x>y;
    }
}

【问题讨论】:

  • 难道compare 不是const
  • 我认为是这样,但我不允许更改任何类编译,所以当我传入更大的仿函数进行比较时,我不知道如何使用 top( )
  • 这没有多大意义。你是说this-&gt;comparegreater 实例吗?如果是这样,则您的代码已损坏,因为它假定 TYPEint。但是您可以即时创建一个本地 greater 实例,允许您在其上调用非常量方法。
  • 我的构造函数初始化了一个通过 this->compare 访问的仿函数,我传递的大于 to。在其他方法中使用它时,它可以正常工作并适当排序。请记住,任何函子都可以传递到类中进行存储,但在这种情况下,我选择了更大的。如果这更有意义的话,我只是无法在 top() 类中访问这个函子

标签: c++ templates constants


【解决方案1】:

greater 的调用运算符设为const 运算符:

struct greater
{
    bool operator()(int x,int y) const
    {
        return x>y;
    }
}

这同样适用于this-&gt;compare 解析的任何内容。必须是const

比较器是非常量没有多大意义。

【讨论】:

    【解决方案2】:

    看起来问题在于compare 成员将operator() 声明为非const 函数。由于听起来您无法更改它,因此您可以通过在poorman_heap 中将其声明为mutable 成员来获得所需的行为。

    mutable 关键字可让您区分对象为“物理上 const”(意味着实际字节不会改变)和“逻辑上 const”(意味着字节可能会改变,但对象的值在基本意义上并没有什么不同)。基本上它意味着对于const-ness 而言“不重要”的东西。我心目中的经典例子是延迟初始化——你想声明get_value() 函数在一个类 const 上,但如果没有人使用它,你也不想浪费时间计算值,所以你声明值 mutable 现在你可以计算它并在 @987654333 中分配给它@ 即使它是 const 成员函数。

    【讨论】:

      猜你喜欢
      • 2011-04-27
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多