Как использовать std :: ref? - PullRequest
       18

Как использовать std :: ref?

9 голосов
/ 06 марта 2012

Как правильно использовать std::ref?Я попробовал следующий код в VS2010, и он не компилируется:

#include <vector>
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
struct IsEven
{
    bool operator()(int n) 
    {
        if(n % 2 == 0)
        {
            evens.push_back(n);
            return false;
        }

        return true;
    }

    vector<int> evens;
};
int main(int argc, char **argv)
{
    vector<int> v;
    for(int i = 0; i < 10; ++i)
    {
        v.push_back(i);
    }

    IsEven f;
    vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), std::ref(f));
    return 0;
}

Ошибки:

c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include\ xxresult (28): ошибка C2903: «результат»: символ не является ни шаблоном класса, ни шаблоном функции

c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ xxresult (28): ошибка C2143: синтаксическая ошибка: отсутствует ';'до '<' </p>

Плюс еще немного ...

Ответы [ 2 ]

8 голосов
/ 06 марта 2012

В реализации Visual C ++ 10.0 std::ref.

имеется ошибка или набор ошибок.

Как сообщается, это было исправлено для Visual C ++ 11; см. мой предыдущий вопрос об этом .

STL в Microsoft ответил так: «Мы уже исправили это, и исправление будет доступно в VC11 RTM. (Однако исправление не попало в бета-версию VC11.)»

4 голосов
/ 06 марта 2012

Я получил ту же ошибку компиляции с VS2010 и исправил ее, унаследовав от std::unary_function:

struct IsEven : std::unary_function<int, bool>

Я рассмотрел это только из-за result, появившегося в сообщении об ошибке. Я могу только догадываться, что std::ref в VS2010 зависит от typedef s в unary_function:

template <class Arg, class Result>
  struct unary_function {
    typedef Arg argument_type;
    typedef Result result_type;
  };

EDIT:

См. Ответ от Приветствия и hth. - Alf относительно ошибки в VS2010.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...