我搜索了一下是否找到了这个问题的解决方案,但我无法看到答案。我遇到的问题是在我的代码编译时,我没有得到intellisense
如果我收到一个参数(或声明一个变量),例如模板T:
unique_ptr<vector<unique_ptr<T>>> & dataSets;
intellisense找到dataSets.get()但它找不到dataSets.get() - &gt; clear();但是,如果我这样做,它会编译好。 但是,如果它不是模板,它似乎工作正常。
CODE:
template <typename T>
void mtsql::MTMySQL<T>::executePrepareStatement(const string & sqlText,const unique_ptr<vector<SQLDataType>> & argList,unique_ptr<vector<unique_ptr<T>>> & dataSets)
{
dataSets.get()->clear();
unique_ptr<sql::ResultSet> rs;
for (auto iter = argList->cbegin(); iter != argList->cend() ; ++iter)
{
auto ps = this->createPreparedStatment(sqlText,args);
rs.reset(ps->execute());
dataSets.get()->insert(std::move(rs));
ps.release();
}
}
我是c ++ 11的新手,所以我可能会做一些可能错误的额外步骤或步骤(例如,我认为不需要ps.release()...我的意思是删除它,但是因为这是一个明智的点)
感谢您的帮助!
编辑1: 感谢您的帮助,我的代码看起来更好,没有可能的泄漏。 谢谢!
dataSets->clear();
for (auto iter = argList->cbegin(); iter != argList->cend() ; ++iter)
{
auto ps = this->createPreparedStatment(sqlText,args);
dataSets->push_back(std::move(rs));
}
答案 0 :(得分:2)
C ++不是一种解析和语义的简单语言。因此,您无法期望IntelliSense能够与复杂类型完美配合。
至于您的代码,您可以简化要执行的代码:
dataSets->clear(); // no need to use `get` here.
for (auto& ignored : *argList) { // use range-based for.
auto ps = this->createPreparedStatment(sqlText,args);
dataSets->insert(ps->execute()); // no need to define 'rs'.
// no need to release explicitly, if they are indeed smart pointers.
}
(如果dataSets
真的是unique_ptr<vector<unique_ptr<T>>>
,我认为您应该使用dataSets->push_back
代替insert
。)
修改:MSVC 2010 does not support range-based for。它确实支持lambdas:
std::for_each(argList->cbegin(), argList->cend(), [&](const vector<SQLDataType>&) {
auto ps = this->createPreparedStatment(sqlText,args);
dataSets->insert(ps->execute()); // no need to define 'rs'.
});
答案 1 :(得分:2)
C ++中模板参数和相关名称的IntelliSense充其量是有限的。
T
可以是任何类型。 IntelliSense无法准确计算一组对您的模板实例化的所有实际类型都有效的操作。
请注意,此问题也会影响相关类型,而不仅仅影响T
本身,因为T
或您使用T
实例化的模板(如示例中的std::vector<std::unique_ptr<T>>
)可以明确专门化,并且那些显式专业化可能具有与主要模板不同的成员。
从使用情况来看,似乎在某些情况下尽力尝试为依赖名称构建完成列表,但如果此列表不完整,空白或不正确,则不应该太惊讶。
概念,一个为C ++ 11提出但最终从规范中删除的功能,可能会为模板参数和许多相关名称提供更好的IntelliSense。