【问题标题】:Method as default parameter for a method方法作为方法的默认参数
【发布时间】:2017-01-20 19:54:05
【问题描述】:

我目前正在为 c++ 课程开发一个 Set-class,它是从 vector<T> 派生的。

在某一点上,我需要实现一个名为index() 的函数,它显然会返回(如果集合包含它)这些集合中对象的索引。 在编写整个课程时,我需要重载这些 index() 方法,这两个方法都是公共的。 所以这是我的两种方法: 第一个。有 3 个参数:

size_t index ( T const& x,size_t const& l, size_t const& r) const
{

    if(l > size()||r>size())
        throw("Menge::index(): index out of range.");

    //cut the interval
    size_t m = (l+r)/2;

    // x was found
    if( x == (*this)[m])
        return m;

    // x can't be found
    if( l==m)
        return NPOS;

    //rekursive part
    if( x < (*this)[m])
        return index(l,m,x);

    return index(m+1,r,x);

}

第二个有一个参数:

bool contains ( T const& elem ) const{
    return index(elem, 0, size()-1)!=NPOS;
}

关键是我不想写这两种方法,如果可能的话,它可以合二为一。我考虑了index() 方法的默认值,所以我将方法头写成:

size_t index (T const& x, size_t const& l=0, size_t const& r=size()-1)const;

这给了我错误: Elementfunction can't be called without a object

在考虑了这个错误之后,我尝试将其编辑为:

size_t index (T const& x, size_t const& l=0, size_t const& r=this->size()-1)const;

但这给了我错误:You're not allowed to call &gt;&gt;this&lt;&lt; in that context.

也许我错过了一些事情,但是如果你们中的任何人可以告诉我是否可以将方法作为默认参数调用,请告诉我。

【问题讨论】:

    标签: c++ methods template-classes


    【解决方案1】:

    定义默认参数时不能使用this

    默认参数source中不允许使用this指针。

    实现这一点的常用方法是提供具有较少参数的重载,这相当于您要避免的初始情况。

    size_t index ( T const& x,size_t const& l, size_t const& r) const;
    size_t index ( T const& x ) const {
        index( x, 0, size() - 1 );
    }
    

    或者,您可以考虑分配一个幻数作为默认参数,您可以在实现中对其进行测试。

    #include <limits>
    
    constexpr size_t magic_number = std::numeric_limits<size_t>::max();
    
    size_t index ( T const & x, size_t l = 0, size_t r = magic_number) const
    {
        if(r == magic_number) {
            r = size() - 1;
        }
    
        // Actual implementation
    }
    

    【讨论】:

    • 默认参数值必须是编译时常量。不正确。见ideone.com/PWFFHS
    • @RSahu 所以没有办法做到这一点?
    • @PhilippZettl,没有办法怎么办?
    • 给一个方法另一个方法作为默认参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多