带有 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 以保持类型相关代码的分离。
我在将 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 constexprif 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 以保持类型相关代码的分离。