Есть ли обходные пути для этой ложной ошибки IntelliSense C2010 C ++? - PullRequest
0 голосов
/ 07 сентября 2011

Вот пример кода, который иллюстрирует проблему.
Он правильно компилируется и запускается , но редактор IntelliSense VS2010 жалуется на переменную hold и показывает следующее сообщение

IntelliSense: нестатическая ссылка на член должна быть относительно конкретный объект

class tester
{
public:
    void test()
    {
        int outer[] = {1,2,3};
        int inner[] = {4,5,6};
        std::for_each(outer, outer + _countof(outer), [&](int o) {
            std::for_each(inner, inner + _countof(inner), [&](int i) {
                hold.push_back(i + o);
            });
        });
    }
private:
    std::vector<int> hold;
};

int main(int argc, char* argv[])
{
    tester().test();
    return 0;
}

NB. Хорошо, если существует только один уровень for_each (например, только внешний)

Кто-нибудь еще сталкивался с этим, и если да, есть ли способ немного изменить его, чтобы IntelliSense был доволен, или я застрял с красными волнистыми линиями?

UPDATE: Я скачал предварительный просмотр VS11, он доволен кодом - никаких кривых строк, так что, по крайней мере, это было исправлено в следующем выпуске.

1 Ответ

2 голосов
/ 30 сентября 2011

Если вы просто ищете обходной путь для успокоения intellisense VS2010, вы можете захватить удержание во внешней лямбде следующим образом:

std::for_each(outer, outer + _countof(outer), [&](int o) {
    auto &hold = this->hold; // capturing hold to avoid intellisense reporting an "error"
    std::for_each(inner, inner + _countof(inner), [&](int i) {
        hold.push_back(i + o);
    });
});

Явно определите тип удержания или переименуйте переменную для ясности, как вы чувствуете,подходящий (используя авто и скрытие имени из-за лени).

...