0

この問題の解決策を見つけるために検索しましたが、答えを見つけることができませんでした。私が抱えている問題は、コードのコンパイル中にインテリセンスが得られないことです。

テンプレート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));         
}
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_backinsert


編集:MSVC 2010は、の範囲ベースをサポートしていません。ただし、ラムダはサポートしています。

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または、インスタンス化するテンプレートTstd::vector<std::unique_ptr<T>>例のように)が明示的に特殊化され、それらの明示的な特殊化がプライマリテンプレートとは異なるメンバーを持つ可能性があるためです。

使用法から、依存する名前の補完リストを作成するために最善を尽くしているように見えますが、このリストが不完全、空、または正しくない場合でも、それほど驚くことはありません。

C ++ 11で提案されたが、最終的には仕様から削除された機能であるConceptsは、テンプレートパラメーターおよび場合によっては多くの依存名に対してはるかに優れたIntelliSenseを有効にする可能性があります。

于 2012-07-13T18:19:11.133 に答える