尋常でないもふもふ

a software engineer blog

C++糞コンパイルエラー集

わかりにくいコンパイルエラーに悩まされて時間を無駄にすることがたびたびあり、6度目くらいでカッとなって記事にすることにした。順次追加していく。

Member reference base type 'User *const' is not a structure or union

以下は std::vector の中から指定の name に一致するユーザーの id を取得するサンプルコード。

int findByName(std::vector<User*> users, const std::string& name)
{
    auto user = std::find_if(users.begin(), users.end(), [name](User* u)
    {
        return u->getName() == name;
    });
    return user->getId(); // ここでエラー
}

正しいコードはこちら。
std::find_if の戻り値がイテレータであることを知らずにオブジェクトだと誤解してるとハマる。ポインタにキャストすると値が取れる。

int findByName(std::vector<User*> users, const std::string& name)
{
    auto itr = std::find_if(users.begin(), users.end(), [name](User* u)
    {
        return c->getName() == name;
    });

    if (itr == users.end())
    {
        return -1;
    }
    else
    {
        return (*itr)->getId();
    }
}

id を返すコードだったため余計にエラー文がわかりづらい表現になっていた。もし User* 自体を返すコードだったら以下のようなエラー文になる。

No viable conversion from returned value of type 'std::__1::__wrap_iter<User**>' to function return type 'User *'

wrap_iter<User**> となるためイテレータ型であることに早期に気づいたかもしれない。