【发布时间】:2014-04-20 05:21:17
【问题描述】:
我正在学习模板。
我有:
template<typename SQLObject>
std::vector<SQLObject> executeSelectQueryReturnSQLVector(std::string _recordType,
std::string _sql,
int _rowCount)
{
typename std::vector<SQLObject> v;
if (_recordType == AppConstants::sSQLFieldObject)
{
for(int r=0; r < _rowCount; r++)
{
SQLFieldObject o;
o.putFieldNumber(sqlite3_column_int(statement, 0));
[snip]
v.push_back(o);
}
}
if (_recordType == AppConstants::sSQLNotificationObject)
{
for(int r=0; r < _rowCount; r++)
{
SQLNotificationObject o;
o.putNotificationID(sqlite3_column_int(statement, 0));
[snip]
v.push_back(o);
}
}
return v;
}
我在v.push_back(o); 上收到一个编译器错误,指出:
no matching member function for call to 'push_back'
我认为这是有道理的,为什么它对我来说很模糊,因为这是在编译时确定的类型名?
这是否意味着我必须实现自己的push_back() 函数?
Vandevoorde 和 Josuttis @ 2003 的“C++ 模板完整指南”是否仍然适用于 C++11?
更新 1: 考虑这个编辑:
template<typename SQLObject>
std::vector<SQLObject> executeSelectQueryReturnSQLVector(std::string _recordType,
std::string _sql,
int _rowCount)
{
//typename std::vector<SQLObject> v;
if (_recordType == AppConstants::sSQLFieldObject)
{
std::vector<SQLFieldObject> v;
for(int r=0; r < _rowCount; r++)
{
SQLFieldObject o;
o.putFieldNumber(sqlite3_column_int(statement, 0));
[snip]
v.push_back(o);
}
return v;
}
if (_recordType == AppConstants::sSQLNotificationObject)
{
std::vector<SQLNotificationObject> v;
for(int r=0; r < _rowCount; r++)
{
SQLNotificationObject o;
o.putNotificationID(sqlite3_column_int(statement, 0));
[snip]
v.push_back(o);
}
return v;
}
//return v;
}
return v; 都出现编译器错误,例如:
no viable conversion from 'vector<class SQLFieldObject>' to 'vector<class SQLNotificationObject>'
no viable conversion from 'vector<class SQLNotificationObject>' to 'vector<class SQLFieldObject>'
我这样称呼:
std::vector<SQLFieldObject> _v = executeSelectQueryReturnSQLVector<SQLFieldObject> (AppConstants::sSQLFieldObject, getSQLToSelectFields(), rowCount);
和
std::vector<SQLNotificationObject> _v = executeSelectQueryReturnSQLVector<SQLNotificationObject>(AppConstants::sSQLNotificationObject, getSQLToSelectNotifications(), rowCount);
【问题讨论】:
-
问题不在于模板的使用,而在于您尝试将
SQLNotificationObject或SQLFieldObject添加到SQLObject的向量中。尝试不使用模板编写代码,你会看到同样的问题。 -
我认为您的 SQLObject 是多态类型。在这种情况下,您需要使用指针向量,即 vector
。这将允许您将 SQLFieldObject 的指针以及 SQLNotificationObject 的指针存储在同一向量中。 -
@rockoder - 我实际上调用了它两次,当被调用时它总是进入向量的相同类型。我又更新了。
-
为了可读性,您不应将模板参数称为与实际类相同的东西(我不确定您是否正在这样做,但根据名称@看来您可能会这样做987654333@ 和
SQLFieldObject)。 -
@matt。为了安全起见,我将替换为 T。
标签: c++ templates vector compiler-errors