“#is iser”

时间:2015-05-20 14:43:43

标签: c++ string

我试图用C ++开发BattleShip游戏,我差不多完成了。为此,我需要我的gameOver功能。所有的船都沉没了,我的游戏结束了。因此,我试图计算我的字符串状态(来自Ship)中有多少个小写字符。当一半的字符是小写字母时," ship"被销毁,我已准备好使用我的gameOver功能。

但不知怎的,我的count_if无法正常工作,我也不知道为什么。

你走了:

#include <algorithm>

bool Ship::isDestroyed() const{ 
    //This counts those chars that satisfy islower:
    int lowercase = count_if (status.begin(), status.end(), islower); 
    return ( lowercase <= (status.length/2) ) ? true : false;
}

bool Board::gameOver() {
    bool is_the_game_over = true;
    for(int i = 0 ; i < ships.size() ; i++){
        if( ships[i].isDestroyed() == false ) {
            //There is at least one ship that is not destroyed.
            is_the_game_over = false ;
            break;
        }
    }
    return is_the_game_over;
}

我做错了什么?

2 个答案:

答案 0 :(得分:10)

不幸的是,标准库有多个islower的重载(来自C库的函数,以及来自本地化库的函数模板),所以你不能简单地命名函数,除非你& #39;重新打电话。

您可以将其转换为正确的函数类型:

static_cast<int (*)(int)>(islower)

或希望您的实现将C库转储到全局命名空间以及std

::islower      // not guaranteed to work

或将其包裹在lambda中

[](int c){return islower(c);}

答案 1 :(得分:3)

尝试按以下方式更改算法调用

int lowercase = count_if (status.begin(), status.end(), ::islower); 
                                                        ^^^

允许编译器将标准C函数放在全局命名空间中。

否则使用lambda表达式,例如

int lowercase = count_if (status.begin(), status.end(), 
                          []( char c ) return islower( c ); } );