0

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

如果我收到一个参数(或声明一个变量),例如模板 T :

unique_ptr<vector<unique_ptr<T>>> & dataSets;

智能感知找到 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));         
}
4

2 回答 2

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 不支持基于范围的. 它确实支持 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'.
});
于 2012-07-13T18:06:20.797 回答
2

C++ 中模板参数和依赖名称的 IntelliSense 充其量是有限的。

T可以是任何类型。IntelliSense 无法准确计算一组通用操作,这些操作对您的模板将被实例化的所有实际类型都有效。

请注意,此问题也会影响依赖类型,而不仅仅是其T本身,因为T您实例化的模板T(如std::vector<std::unique_ptr<T>>您的示例中)可能是显式特化的,并且这些显式特化可能具有与主模板不同的成员。

从用法来看,在某些情况下,它似乎尽最大努力为从属名称构建完成列表,但如果此列表不完整、为空或不正确,不应该太惊讶。

概念是为 C++11 提出的一项功能,但最终从规范中删除,它可能会为模板参数和许多依赖名称提供更好的 IntelliSense。

于 2012-07-13T18:19:11.133 回答