IntelliSense Visual Studio 2010 SP1 unique_ptr:unique_ptr <vector <unique_ptr <t>&gt;&gt; Ť</载体<的unique_ptr <T>

时间:2012-07-13 17:56:24

标签: c++ visual-studio-2010 visual-c++ c++11 intellisense

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

2 个答案:

答案 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。