智能感知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

本文关键字:ptr gt lt unique vector 感知 Visual Studio SP1 2010 智能      更新时间:2023-10-16

我搜索了一下是否找到了这个问题的解决方案,但没有找到答案。我遇到的问题是,当我的代码编译时,我没有得到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。