我进行搜索以查看是否找到了解决此问题的方法,但找不到答案。我遇到的问题是我的代码编译时,没有智能感知

如果我使用模板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 does not support range-based for。它确实支持lambda:

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++ - 智能感知Visual Studio 2010 SP1 unique_ptr:unique_ptr <vector <unique_ptr <T >>> T,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11475785/

10-13 08:07