Eclipse CDT indexing and std::unique_ptr

Eclipse CDT indexing and std::unique_ptr

本文关键字:unique ptr std CDT indexing and Eclipse      更新时间:2023-10-16

我在这段代码中使用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);

但是,我收到了来自EclipseCDT的错误消息。在第四行:方法"insert"无法解析,方法"end"无法解析。

以前,我在std::unique_ptr这个名称的外观上也遇到过错误。这是通过设置预处理器符号__GXX_EXPERIMENTAL_CXX0X__和重建索引来解决的,如该问题的答案中所述。

有没有一种方法可以让CDT理解s的类型是std::string*,并且它应该在std::string中查找s->insert()和s->end()?

附言:我使用的是Eclipse 3.7.1和CDT 8.0.0.2011 1106081058

PS2:我本想在上面的问题中发表评论,但我不能,大概是因为我是一个新用户

Eclipse CDT索引器似乎无法推导出unique_ptr::指针类型,该类型也用作运算符->()的返回类型。当你键入类似的内容时,你可以看到这一点

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

将"检测到"一个错误,即没有匹配的过载,并且唯一的候选者将是reset(?)。所以这显然是一个bug。

这个问题最近在cdt 8.1.1中得到了修复。只需进入帮助->检查更新,它就会被下载并安装。我已经测试了unique_ptr,它被正确地索引了。

我在新版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) };