2

似乎 QtConcurrent 与 QT 容器 (QList和) 一起工作正常,但与 STL 容器一起失败,这与文档QVector中声称的相反

以下是我想在容器上使用的虚拟函数:

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:“重新绑定”:符号既不是类模板也不是函数模板 1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility (442):错误 C2039:“重新绑定”:不是“的成员”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>' 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:“正在初始化”:

4

1 回答 1

8

我认为您应该明确地将容器的类型赋予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);
}

编译并在您给出的简单示例中给我预期的结果。

于 2011-07-20T13:11:11.270 回答