QtConcurrent :: blockingMapped () и std :: vector <> bug - PullRequest
1 голос
/ 20 июля 2011

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

1 Ответ

6 голосов
/ 20 июля 2011

Я думаю, вы должны явно указать тип контейнера для 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);
}

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

...