智能感知Visual Studio 2010 SP1 unique_ptr : unique_ptr<vector<unique_ptr<T>>> T
IntelliSense Visual Studio 2010 SP1 unique_ptr : unique_ptr<vector<unique_ptr<T>>> T
我搜索了一下是否找到了这个问题的解决方案,但没有找到答案。我遇到的问题是,当我的代码编译时,我没有得到intellisense
如果我收到一个参数(或声明一个变量),比如模板T:
unique_ptr<vector<unique_ptr<T>>> & dataSets;
intellisense找到dataSets.get(),但没有找到dataSets.get()->clear();然而,如果我这样做,它会编译得很好。然而,如果它不是一个模板,它似乎工作得很好。
代码:
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));
}
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不支持基于范围的。它确实支持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'.
});
C++中模板参数和依赖名称的IntelliSense充其量是有限的。
T
可以是任何类型。IntelliSense无法准确计算一组通用操作,这些操作对将要实例化模板的所有实际类型都有效。
请注意,这个问题也会影响依赖类型,而不仅仅是T
本身,因为T
或用T
实例化的模板(如示例中的std::vector<std::unique_ptr<T>>
)可能是显式专用的,并且这些显式专用可能具有与主模板不同的成员。
从使用情况来看,在某些情况下,它似乎会尽最大努力为依赖名称建立一个完整列表,但如果该列表不完整、为空或不正确,则不应感到太惊讶。
Concepts是为C++11提出的一项功能,但最终从规范中删除,它可能会为模板参数以及许多依赖名称提供更好的IntelliSense。
- CLANG 编译器 说:变量"PTR"可能未初始化
- EASTL矢量<向量<int>>连续的
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 这是MSVC 2013中具有共享PTR的单例的正确实现吗?
- 对唯一 ptr 无效读取的引用向量
- C++ 类型转换基础 PTR 到派生 PTR 保存在引用类中
- 如何使用非类型参数传递模板化类的 Ref 或 Ptr