2017-03-12 8 views
1

Iコード場合: -Resharperはハードコードでstd :: make_uniqueを認識しますか?

class B; //some B.h has definition of B 
std::make_unique<B>(); 

ReSharperのは、私がB.hを含まなければならないことを私に警告します。 (正しい)

タイプ 'B' 私はstd::unique_ptr<T>のコードを模倣しTest.h内に置くしようとした場合、しかし、

不完全である: -

をTEST.H

//inside class Test 
template<class _Ty, 
class... _Types> inline 
typename std::enable_if<!std::is_array<_Ty>::value, 
    std::unique_ptr<_Ty> >::type test2(_Types&&... _Args) 
{ // make a unique_ptr 
return (std::unique_ptr<_Ty>(new _Ty(std::forward<_Types>(_Args)...))); 
} 

test.cpp

#include "Test.h" 
//inside some function 
test2<B>(); 

私は警告を受けません。 (Bが不完全であるため、それは互換性のないです。)

  • 質問ReSharperのは約std::make_uniqueチェックをハードコーディングしていますか?

  • もしそうでなければ、Resharperが正しく推奨する方法でコーディングする方法はありますか? (B.hを含む必要があります)
    実際の使用では、カスタムスマートポインタ+プール
    を作成しようとしていますが、ユーザーのファイルに#includeを正しくお勧めします。

std::make_sharedにも発生します。

編集: - イゴールAkhmetovは、それがハードコードされたことを述べたように

、とにかく私はでき手掛かりReSharperのがありますか?例えば: -

//Hey, Resharper, the user must include full definition of "T". 
// Resharper, forward declaration is not enough for "T". 
template<class T> T* f(){ 
    return new T(); 
} 

答えて

1

あなたは正しい、完全性および過負荷解像度のチェックがstd::make_uniquestd::make_sharedのためにハードコードされています。 std::make_uniqueのような関数の場合、R ++は関数のシグネチャから、テンプレート引数として使用されるクラスの定義が必要であると推論することはできません。しかし、std::make_uniquestd::make_uniqueは非常に一般的であり、追加のチェックが特別に導入されました。

つまり、テンプレート引数として使用されるクラスの定義は、通常、参照を転送するテンプレート関数のパラメータに必要です。この場合、警告を表示することも考えられます(ただしエラーはありません)。

+0

ありがとう!しかし、少し残念ですが、この機能を実装するのがどれほど難しいか理解できます。 .....ところで、Resharperを手がかりにする方法はありますか? (質問を編集しました) – javaLover

+1

現時点ではこれを行う方法はありません。自然なアプローチは特別な属性を持つことですが、C++のテンプレートパラメータには属性を適用できないようです。私はhttps://youtrack.jetbrains.com/issue/RSCPP-19172を提出しました。私たちはそれをやり遂げる何らかの方法を考え出すことができます。 –

+0

Resharper C++の自動補完機能に関するもう1つの質問があります。 Resharperがそれを行うことができるかどうかわからない。あなたが見ていただければ幸いです。 http://stackoverflow.com/questions/43164856/autocompletion-of-parameter-list-static-fields-without-typing-a-classname – javaLover

関連する問題