Ошибка QtConcurrent::blockingMapped() и std::vector‹›

Кажется, что QtConcurrent отлично работает с контейнерами QT (QList и QVector), но не работает с контейнерами STL, в отличие от заявленного в документации

Вот фиктивные функции, которые я хочу использовать в своих контейнерах:

void addOne(int & i)
{
    ++i;
}

int addOneC(const int & i)
{
    return i+1;
}

Примеры того, что работает:

int main( int argc, char** argv )
{
    // Qt containers
    QList<int> l;
    l << 1 << 2 << 4 << 3;
    QList<int> l1 = QtConcurrent::blockingMapped(l, addOneC);
    QtConcurrent::blockingMap(l1, addOne);

    // Standard containers
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(4);
    v.push_back(3);
    QtConcurrent::blockingMap(v, addOne);
}

Что не работает:

int main( int argc, char** argv )
{
    // Standard containers
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(4);
    v.push_back(3);
    vector<int> v1 = QtConcurrent::blockingMapped(v, addOneC);
}

Это вызывает ошибку компиляции с ужасно длинными и запутанными ошибками шаблона.

Если бы кто-нибудь знал, почему, это действительно помогло бы! Спасибо!


Журнал ошибок:

1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(442): ошибка C2825: '_Alloc': должен быть класс или пространство имен, если за ним следует '::' 1> .\main .cpp(187): см. ссылку на создание экземпляра шаблона класса 'std::_Container_base_aux_alloc_real‹_Alloc>', скомпилированного 1> с 1> [ 1> _Alloc=int 1> ] 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(442): ошибка C2903: 'rebind': символ не является ни шаблоном класса, ни шаблоном функции 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility (442) : ошибка C2039: 'rebind' : не является членом 'global namespace'' 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(442) : error C2143: syntax error : missing ';' before '<' 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(442) : error C2039: 'other' : is not a member of 'global namespace'' 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(442) : ошибка C2238: неожиданно токен (ы), предшествующий ';' 1>.\main.cpp(187): ошибка C2248: 'std::_Container_base_aux_alloc_real‹_Alloc>::~_Container_base_aux_alloc_real': невозможно получить доступ к защищенному члену, объявленному в классе 'std::_Container_base_aux_alloc_real‹_Alloc>' 1> с 1> [ 1> _Alloc=int 1> ] 1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility(435): см. объявление 'std::_Container_base_aux_alloc_real‹_Alloc>::~_Container_base_aux_alloc_real' 1 > с 1> [ 1> _Alloc=int 1> ] 1>.\main.cpp(187): ошибка C2440: «инициализация»: невозможно преобразовать из «std::_Container_base_aux_alloc_real‹_Alloc>» в «std::vector» _Ty>' 1> с 1> [ 1> _Alloc=int 1> ] 1> и 1> [ 1> _Ty=int 1> ] 1> Ни один конструктор не может принять исходный тип, или разрешение перегрузки конструктора было неоднозначным


person B. Decoster    schedule 20.07.2011    source источник
comment
Sotyy, я отредактировал свой пост следующим образом: это вызывает ошибку компиляции с ужасно длинными и запутанными ошибками шаблона.   -  person B. Decoster    schedule 20.07.2011


Ответы (1)


Я думаю, вы должны явно указать тип контейнера для blockingMapped.

int main( int argc, char** argv )
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(4);
    v.push_back(3);

    std::vector<int> v1 = QtConcurrent::blockingMapped<std::vector<int> >(v, addOneC);
}

Скомпилируйте и дайте мне ожидаемый результат в простом примере, который вы привели.

person Thomas Vincent    schedule 20.07.2011
comment
Как, черт возьми, тебе удалось это понять? И как компилятору удается вывести типы в других случаях использования? - person UncleBens; 20.07.2011
comment
@UncleBens: Не знаю ... когда я просмотрел файл qtconcurentmap.h и увидел так много шаблонных способов использования функции blockingMapped, я подумал, что, возможно, мы могли бы «помочь» компилятору ... Я столкнулся с подобными проблемами с моим собственным шаблонные классы контейнеров. Он должен иметь реальную разницу между реализациями (контейнеры std и Qt) на стороне Qt, но мне не хочется копаться в QtConcurrent коде;)... - person Thomas Vincent; 20.07.2011
comment
Спасибо в любом случае за помощь! Я не просматривал источник, так как был ослеплен тем фактом, что он работает для контейнеров Qt. - person B. Decoster; 20.07.2011