2012-01-17 10 views
8

私は期待通りにコンパイルして実行するこのコードでstd :: unique_ptrを使用しています。Eclipse CDTの索引付けとstd :: unique_ptr

std::stringstream out; 
out << std::setw(3) << std::setfill('0') << i; 
std::unique_ptr<std::string> s(new std::string(out.str())); 
s->insert(s->end()-2, 1, '.'); 
return std::move(s); 

ただし、Eclipse CDTからエラーメッセージが表示されています。 4行目:メソッド 'insert'を解決できませんでした。メソッド 'end'を解決できませんでした。

以前は、std :: unique_ptrという名前の出現でエラーが発生していました。これは、this質問の回答に記載されているように、プリプロセッサシンボル__GXX_EXPERIMENTAL_CXX0X__を設定してインデックスを再構築することで解決しました。

sはstd :: string *型であり、s-> insert()およびs-> end()のstd :: stringを参照する必要があることをCDTに理解させる方法はありますか?

PS:私は、Eclipse 3.7.1とCDTを使用しています8.0.0.201106081058

PS2:、私は上記の質問にコメントとしてこれを投稿したかったが、私はできない私は、おそらくので、新規ユーザー

答えて

4

Eclipse CDTインデクサーは、operator - >()の戻り値の型としても使用されるunique_ptr :: pointer型を推測できないようです。あなたはエラーが一致するオーバーロードはないであろうこと、そして唯一の候補者はreset(?)になるだろうと、「検出」されます

std::unique_ptr<Type *> ptr; 
ptr.reset(new Type); 

のようなものを入力するときは、これを見ることができます。これは明らかにバグです。

2

この問題は、cdt 8.1.1で最近修正されました。ちょうど助けに行く - >更新を確認し、ダウンロードされ、インストールされます。私はunique_ptrをテストしており、適切に索引付けされています。

+1

を私はそれがCDT 8.1.2で動作していることを確認することができます – Nobody

1

Eclipse CDT(9.3)の新しいバージョンで同じ問題が発生しました。私はインターネット上で見つけたすべてのトリックを試してみました。私の指数が変わるのを願って、毎回再構築しました。しかし、インデクサーは決してstd::unique_ptr<T>::operator->()の種類を推測することはできませんでした。

# ifdef ECLIPSE_INDEXER_WORKAROUND 
MyType* my_var; 
# else 
std::unique_ptr<MyType> my_var; 
# endif  

私はEclipseで(建物のない、唯一のインデックスのオプションのためのコースの)プリプロセッサシンボルにECLIPSE_INDEXER_WORKAROUNDを追加し、インデックスが再び有用です:最後に、私は非常に単純な回避策を使用することにしました!

少ないコードを汚染するために、我々はマクロを使用することができます:

# ifdef ECLIPSE_INDEXER_WORKAROUND 
# define MY_UNIQUE_PTR(type) type* 
# else 
# define MY_UNIQUE_PTR(type) std::unique_ptr<type> 
# endif 

MY_UNIQUE_PTR(int) pint{ new int(42) };