Кажется, что 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> Ни один конструктор не может принять исходный тип, или разрешение перегрузки конструктора было неоднозначным