2012-01-17 106 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的错误消息。在第四行:Method'insert'无法解析,Method'end'无法解析。

以前,我在std :: unique_ptr这个名字的外观上也出现错误。这可以通过设置预处理器符号__GXX_EXPERIMENTAL_CXX0X__并重建索引来解决,如this问题的答案中所述。

有没有办法让CDT明白s是std :: string *类型,并且它应该在std :: string中查找s-> insert()和s-> end()?

PS:我使用Eclipse 3.7.1和CDT 8.0.0.201106081058

PS2:我本来希望这张贴在上面的问题中留言,但我做不到,大概是因为我是一个新用户

回答

4

看起来好像Eclipse CDT索引器不能推导出unique_ptr :: pointer类型,该类型也被用作operator - >()的返回类型。你可以看到这个当你输入像

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

的错误将被“检测”,将有没有匹配的过载,并且该唯一的候选人将是reset(?)。所以这显然是一个错误。

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_INDEXER_WORKAROUND到预处理器符号(仅用于索引选项,当然,不建)在Eclipse中,和索引又是有用的!

为了污染少的代码,我们可以使用宏:

# 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) };