I would remove the use of goodip in the while statement and the return statemente and simply directly return false if checkGroupIPv6 returns false:

    while (pos != std::string::npos)
    {
        ...
        if (checkGroupIPv6(partip) == false)
            return false;
        ...
    }

    return (cont > 1) && (cont < 8);

Same reason as always, the code gets easier to understand.