带有 QString 的模板迭代器

Template iterator with QString

我在将 vector<'T> 的模板迭代器传递给函数 QString::fromStdString(const std::string&) 时遇到问题。

我有我的功能,在类型 T 的情况下可以将 std::string 转换为 QString 或将 int 转换为 QString 然后添加到我的 QTableWidget 手机。

问题发生在从 std::string 转换为:

error: no matching function for call to ‘QString::fromStdString(int&)’ QString text = QString::fromStdString(*it);

我不明白为什么迭代器对象的类型有 int&。我做错了什么?我可以用其他方式转换吗?

template<typename T>
void Dialog::Browse(vector<T> *list, int &counter, QTableWidget *table,     int column)
{
    QTableWidgetItem* item = 0;
    typename vector<T>::iterator it;
    for (it = list->begin(); it != list->end(); ++it){
        QString text;
        if (typeid(*list) == typeid(vector<string>)){
            //QString text = QString::fromUtf8(static_cast<string>(it)->c_str());
            QString text = QString::fromStdString(*it);
        } else if (typeid(*list) == typeid(vector<int>)){
            QString text = QString::number(*it);
        }

        item = new QTableWidgetItem(text);
        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
        table->setItem(counter, column, item);
        counter++;
    }
}

这里的问题是 if 语句不会阻止代码被编译。当你这样做时

if (typeid(*list) == typeid(vector<string>)){
    //QString text = QString::fromUtf8(static_cast<string>(it)->c_str());
    QString text = QString::fromStdString(*it);
} else if (typeid(*list) == typeid(vector<int>)){
    QString text = QString::number(*it);
}

无论list 是否为vector<string>,都会编译行QString text = QString::fromStdString(*it);。因为当你用 vector<int> 调用它时,它会尝试使用 int& 编译该代码,你会得到你的错误。

如果你有 C++17,你可以使用像

这样的if constexpr
if constexpr (typeid(*list) == typeid(vector<string>)){
    //QString text = QString::fromUtf8(static_cast<string>(it)->c_str());
    QString text = QString::fromStdString(*it);
} else if constexpr (typeid(*list) == typeid(vector<int>)){
    QString text = QString::number(*it);
}

现在代码只有在条件为真时才会编译。

如果您无法访问 C++17,则需要将函数拆分为 overloads/specializations 以保持类型相关代码的分离。